对特定行使用 sed 命令

对特定行使用 sed 命令

我在 Linux 机器上有一个文本文件,我想对用户使用 perl 脚本输入的行运行 3 个 sed 命令。到目前为止我都是手动执行此操作。

我必须使用的 sed 命令是:

sed -i "s/{+//" error.txt
sed -i "s/+}//" error.txt
sed -i "s/\[-.*-]//g" error.txt

error.txt是我想要运行这些命令的文件,但我希望它们在我将输入的特定行上运行。

错误.txt:

1:module counter ( clk, reset, enable, {+dat_out+} );

4:  input clk, [-reset ;-] {+reset, enable;+}

5:  wire   {+N69, N70, N71,+} N72, N73, N74, N75, N76, N77, N78, N79, N80, 

10:  EDFFX2AD \dat_out_sig_reg[0]  ( [-.D(synopsis_unconnected),-] {+.D(N69),+} .E(N96), .CK(clk), .Q(dat_out[0])

12:  EDFFX2AD \dat_out_sig_reg[1]  ( {+.D(N70),+} .E(N94), .CK(clk), .Q(dat_out[1])

14:  EDFFX2AD \dat_out_sig_reg[2]  ( .D(N71), [-.E(synopsis_unconnected),-] {+.E(N92),+} .CK(clk), .Q(dat_out[2])

预期输出:

1:module counter ( clk, reset, enable, dat_out );

4:  input clk, [-reset ;-] {+reset, enable;+}

5:  wire   {+N69, N70, N71,+} N72, N73, N74, N75, N76, N77, N78, N79, N80, 

10:  EDFFX2AD \dat_out_sig_reg[0]  (  .D(N69), .E(N96), .CK(clk), .Q(dat_out[0])

12:  EDFFX2AD \dat_out_sig_reg[1]  ( {+.D(N70),+} .E(N94), .CK(clk), .Q(dat_out[1])

14:  EDFFX2AD \dat_out_sig_reg[2]  ( .D(N71), [-.E(synopsis_unconnected),-] {+.E(N92),+} .CK(clk), .Q(dat_out[2])

这些代码适用于 1 号线和 10 号线。请提出建议

答案1

您可以以搜索模式等形式指定条件:

sed -i -r '/^10?:/ {s/\{\+//; s/\+}//; s/\[-.*-]//g}' error.txt

1:仅当该行以或开头时才执行替换10:。这是输出:

1:module counter ( clk, reset, enable, dat_out );
4:  input clk, [-reset ;-] {+reset, enable;+}
5:  wire   {+N69, N70, N71,+} N72, N73, N74, N75, N76, N77, N78, N79, N80,
10:  EDFFX2AD \dat_out_sig_reg[0]  (  .D(N69), .E(N96), .CK(clk), .Q(dat_out[0])
12:  EDFFX2AD \dat_out_sig_reg[1]  ( {+.D(N70),+} .E(N94), .CK(clk), .Q(dat_out[1])
14:  EDFFX2AD \dat_out_sig_reg[2]  ( .D(N71), [-.E(synopsis_unconnected),-] {+.E(N92),+} .CK(clk), .Q(dat_out[2])

条件可以是行号:这只会处理第一行:

sed -i -r '1 {s/\{\+//; s/\+}//; s/\[-.*-]//g}' error.txt

既然您提到了 Perl,您可能更喜欢使用以下内容:

perl -i -pe 'if (/^10?:/) {s/\{\+//; s/\+}//; s/\[-.*-]//g}' error.txt

或者:

perl -i -pe 'if ($.==1 or $.==10) {s/\{\+//; s/\+}//; s/\[-.*-]//g}' error.txt

答案2

您可以在命令前添加一行或一个范围sed

对于第一个示例,您可以尝试编号为#4 的第三行:

sed "3 s/{+//" error.txt

或者,如果您需要脚本,您可以使用以下代码片段:

#!/bin/bash

echo -e "Usage:\t ./my_sed.sh linenumber file\n"
sed "$1 s/{+//" $2

相关内容