代替単語は2行目に依存します。

代替単語は2行目に依存します。

ネットリストファイルがあります。区切り線があります。区切り文字は、連続行の先頭にある「+」です。

MP1 Y A VDD VDD pch_25 W=1u L=550n M=1
MP0 Y B
+VDD VDD pch_25 W=1u L=550n M=1
MN1 v0 A VSS VSS nch_25_dnw W=500.0n L=550n M=1
MN0 Y B v0 VSS nch_25_dnw W=500.0n L=550n M=1

(完全な)行に「pch_25」が含まれている場合は、各行の先頭「M」を「X」に置き換えたいので、必要な出力は次のようになります。

XP1 Y A VDD VDD pch_25 W=1u L=550n M=1
XP0 Y B
+VDD VDD pch_25 W=1u L=550n M=1
MN1 v0 A VSS VSS nch_25_dnw W=500.0n L=550n M=1
MN0 Y B v0 VSS nch_25_dnw W=500.0n L=550n M=1

次の(動作する)コマンドがあります。

sed -e :a -e '$!N;s/\n+/\\/;ta' -e 'P;D' file \
                                        | sed '/pch_25/s/^M/X/' | sed -e 's/\\/\n+/g'

sedこのコマンドをパイプレスコマンドに置き換えるにはどうすればよいですか?

答え1

N;P;D通常、モードで同様の操作を実行して、sedバッファに常に2行を一緒に保持するために使用します。残念ながら、ネットリストファイルはレコードを複数行に分割する可能性があるため、一般的なソリューションは機能しません。

確実な解決策は、一緒に属するすべての行を収集するループを追加することです。

sed -e :a -e '/pch_25/s/^M/X/;/\n[^+]/!{N;ba' -e '};P;D' file           
  • /pch_25/s/^M/X/pch_25私たちがやろうとしている実際の交換です。含まれている行でs先行(^アンカー)をMに置き換えますX
  • パターンは、\n[^+]改行文字の後に以外の文字が続くことを定義します+。これは、私たちがあまりにも多くの行を追加してループを終了する必要があることを示します。つまり、inversion と一致すれば、!次の行を追加してNループbaマーカーにジャンプできます。:a
  • 最後に、通常、P;Dバッファの最初の行が印刷され、削除され、新しいループが開始されます。はい、バッファに複数の行を収集した場合、最初の行のみが印刷され削除されます。しかし、問題ありません。パターンが+、notで始まり、M他の行が順番に削除されるため、次のサイクルでは何も置き換えられません。

高度なソリューション:N;P;Dジャンプマーカーとb。コード):DDsed

sed '/pch_25/s/^M/X/;/\n[^+]/!N;//P;//!s/^/\n/;D' file
  • /\n[^+]/!Nそれでも同じネットワークレコードにいる場合は、改行を追加してください。
  • //最後のパターンを繰り返します。これには反転はありませんので、あまりに多くの行を追加するとP最初の部分を印刷できます。
  • //!s/^/\n/まだレコードにある場合は、パターンの先頭に改行文字が追加されるため、最終
  • D交換を確認する必要がある場合は、再起動する前に追加された空の行のみを削除するか、すでに次のレコードにある場合は最初の印刷行を削除します。

残念ながら、\nGNUの非標準アドインはreplacementに使用されるため、sedこれに依存することはできず、予約されたスペースに追加、パターンスペースを消去、xスペース変更などの改行を追加する他の方法を見つける必要があります。

sed '/pch_25/s/^M/X/;/\n[^+]/!N;//P;//!{H;s/.*//;x;};D' file

関連情報