簡體   English   中英

sed 命令在特定模式后打印字符串

[英]sed command to print a string after certain pattern

嘗試在如下行/語句之后使用 sed 打印字符串,

class name extends #(p val1 = 10,
                     p val2 = 20,
                     p val3 = 30) f_name;


class ”和“ extends ”和“ ; ”在該行/語句的末尾(即消耗多行)將保持不變,其他術語的 rest 是隨機的。

預期結果:

class name extends #(p val1 = 10,
                     p val2 = 20,
                     p val3 = 30) f_name;

string t;

試用如下,

試用命令:

sed -i '/^class/a\\string t;'

試驗結果:

class name extends #(p val1 = 10,
string t;
                     p val2 = 20,
                     p val3 = 30) f_name;


如果 class 語句在以下同一行結束,則上述命令正常工作

class name extends f_name;

但是當它消耗多行時不起作用。

請就此提出建議。

必須使用多行技術。 使用 GNU sed

sed -E '/^\s*class\s+\w+\s+extends\b/{ :a; /;\s*$/!{N; ba}; s/$/\nstring t;/ }' file
perl -lpe '$class=1 if /^class/; if ($class and /;$/) { $_ .= "\nstring t;"; $class = 0 }` file

當看到以class開頭的行時,上面的命令會記住。 然后添加一個行string t; 並忘記看到class ,當它看到以;結尾的行時 .

有關使用的各種選項的幫助,請參閱https://perldoc.perl.org/perlrun.html

埃德可以做到這一點。

#!/bin/sh

cat >> append.ed << EOF
\$
a

string t;
.
wq
EOF

ed -s filename < append.ed
rm -v ./append.ed

使用 GNU sed 為-z (將整個輸入作為單個字符串讀取)和\n表示替換文本中的換行符:

$ sed -z 's/class name extends[^;]*;/&\n\nstring t;/' file
class name extends #(p val1 = 10,
                     p val2 = 20,
                     p val3 = 30) f_name;

string t;

否則在每個 UNIX 框上的任何 shell 中使用任何 awk:

$ awk '
    { r = (NR>1 ? r ORS : "") $0 }
    END { sub(/class name extends[^;]*;/,"&\n\nstring t;",r); print r }
' file
class name extends #(p val1 = 10,
                     p val2 = 20,
                     p val3 = 30) f_name;

string t;

這個 perl 單線可以完成這項工作:

perl -0777 -ape 's/\bclass \w+ extends[\s\S]+?;\K/\nstring t;/' file
class name extends #(p val1 = 10,
                     p val2 = 20,
                     p val3 = 30) f_name;
string t;

解釋:

s/                # substitute
    \b              # word boundary
    class           # literally
    \w+             # 1 or more word characters (class name)
    extends         # literally
    [\s\S]+?        # 1 or more any character including newline
    ;               # semi colon
    \K              # forget all we have seen until this position
/                 # with
    \n              # linefeed
    string t;       # literally
/                 # end subs

這可能對您有用(GNU sed):

sed '/^class/!b;:a;/;$/!{N;ba};/extends/astring t;' file

如果當前行沒有開始class ,不感興趣。

如果當前行沒有結束; , append 下一行並重復。

如果當前行包含extended , append 另一個行string t; .


如果是空行,則為包含string t; 是必需的,或者:

sed '/^class/!b;:a;/;$/!{N;ba};/extends/G;//astring t;' file

或者:

sed '/^class/!b;:a;/;$/!{N;ba};/extends/a\\nstring t;' file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM