[英]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.