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