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
。
最初の例では、3行目#4を試すことができます。
sed "3 s/{+//" error.txt
あるいは、スクリプトが必要な場合は、次のコードスニペットを使用できます。
#!/bin/bash
echo -e "Usage:\t ./my_sed.sh linenumber file\n"
sed "$1 s/{+//" $2