行が多いファイルがあります。
一部の行は一致しない中括弧で終わります(例: " }
")。
これは、以下を含む行でのみ機能します。".to"
sedを使用して文字列( "")を含むが、行のどの位置(前または後ろ)に他の文字列( "")がなく、 " "で終わるすべての行から一致しない中括弧を.to
削除するにはどうすればよいですか?{
.to
}
それはまるでsed -i '/\.to/s/[[:space:]]*\}//' file
ただし、これは文字列( " .to
")を含み、}
" "で終わるすべての行に適用されます。
{
次のように中かっこ/角かっこなしで行で機能したいと思います。}
このために、複数行中括弧を心配する必要はありません。クエリに一致する行(この場合は「.to」)を制限すると、これを防ぐのに役立ちます。
例えば
expect(:size).to eq 2 }
expect(:first).to be_persisted }
expect("first.number_field").to eq 10 }
expect(:last).to be_persisted }
expect("last.number_field").to eq 10 }
this remains unchanged }
this {remains} unchanged }
this {
is ok }
=>
expect(:size).to eq 2
expect(:first).to be_persisted
expect("first.number_field").to eq 10
expect(:last).to be_persisted
expect("last.number_field").to eq 10
this remains unchanged }
this {remains} unchanged }
this {
is ok }
答え1
そして真珠そして高度な正規表現を見る:
perl -lpe 's/((?<!\{).*?\.to.*)}\s*$/$1/' file
そしてアッ:
awk '!/{/ && /\.to.*}/{sub(/\}/, "", $NF)}1' file
答え2
もっと簡単なのはどうですか?
sed -i 's@^\([^{]\+\)\(\.to[^{]\+\)}\s*$@\1\2@' your_file
Perlの使用(より良い読みやすさのため):
perl -pi -e 's@
^ # start of line
( [^{]+ ) # at least one non-{ character (save in $1)
(\.to [^{]+ ) # .to and at least one non-{ (save in $2)
} # that pesky }
\s* # optional white space
$ # end of line
@$1$2@x' your_file