繁体   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