我在 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