0

私はいくつかのコードを変換するためのスクリプトを書いています。適切な変換を実行するsedコマンドがありますが、-nコマンドを使用して、パターンスペースの自動印刷を防止し、二重印刷を抑制する必要があります。しかし、これにより、出力したい他の行を印刷できなくなります。これは私が使用しているスクリプトです。

sed -i -r 's/^[ ]*Class[(]"(I((.([A-Za-z]+)))+)"[ ]*,[ ]*(I((.[A-z]+)+)),[ ]*\{/ class \4 extends \5 { /p
/^[ ]*Class[(]"(I((.([A-Za-z]+)))+)"[ ]*,/ {
N
s/ *\n/ /
s/^[ ]*Class[(]"(I((.([A-Za-z]+)))+)"[ ]*,[ ]*(I((.[A-z]+)+)),[ ]*\{*/ class \4 extends \5 { \
/p
}
'

テスト入力ファイルはここにあります: https ://www.dropbox.com/s/h9vly1hwtqtl8te/TestText.txtスクリプトに-nスイッチがある場合とない場合の2つの異なる結果はここにあります:https:/ /www.dropbox.com/s/f0g8horafwial1x/TestText.txt.ts_result1.txtおよびここ:https ://www.dropbox.com/s/ekualxj7foapgml/TestText.txt.ts_result2.txtここ で目的の結果が見つかります:https://www.dropbox.com/s/3510oh899fh0ji2/TestText.txt.ts_resultdesired.txt

望ましい結果を得ることができますか?

$ sed --versionGNUsedバージョン4.2.1を実行しています

4

1 に答える 1

0

二重印刷を防ぐ別の方法はd、最後の印刷コマンドの後にを配置することです(を削除できるようにします-n)。また、印刷後に条件があるため、代わりにコマンドを使用できます。これは、前の置換が成功した場合(つまり、すでに何かを印刷した場合)にラベル(この場合はコマンドの前のラベル)tに分岐します。doned

sed -i -r 's/^[ ]*Class[(]"(I((.([A-Za-z]+)))+)"[ ]*,[ ]*(I((.[A-z]+)+)),[ ]*\{/ class \4 extends \5 { /p
/^[ ]*Class[(]"(I((.([A-Za-z]+)))+)"[ ]*,/ ! t done
/^[ ]*Class[(]"(I((.([A-Za-z]+)))+)"[ ]*,/ {
N
s/ *\n/ /
s/^[ ]*Class[(]"(I((.([A-Za-z]+)))+)"[ ]*,[ ]*(I((.[A-z]+)+)),[ ]*\{*/ class \4 extends \5 { \
/p
: done
d
}
'

(注:これはテストされていません...)

于 2012-10-22T20:22:57.310 に答える