特定の行で 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

最初の例では、3行目#4を試すことができます。

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

あるいは、スクリプトが必要な場合は、次のコードスニペットを使用できます。

#!/bin/bash

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

関連情報