ネットリストファイルがあります。区切り線があります。区切り文字は、連続行の先頭にある「+」です。
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
。コード):D
D
sed
sed '/pch_25/s/^M/X/;/\n[^+]/!N;//P;//!s/^/\n/;D' file
/\n[^+]/!N
それでも同じネットワークレコードにいる場合は、改行を追加してください。//
最後のパターンを繰り返します。これには反転はありませんので、あまりに多くの行を追加するとP
最初の部分を印刷できます。//!s/^/\n/
まだレコードにある場合は、パターンの先頭に改行文字が追加されるため、最終D
交換を確認する必要がある場合は、再起動する前に追加された空の行のみを削除するか、すでに次のレコードにある場合は最初の印刷行を削除します。
残念ながら、\n
GNUの非標準アドインはreplacementに使用されるため、sed
これに依存することはできず、予約されたスペースに追加、パターンスペースを消去、x
スペース変更などの改行を追加する他の方法を見つける必要があります。
sed '/pch_25/s/^M/X/;/\n[^+]/!N;//P;//!{H;s/.*//;x;};D' file