sed - 一致しない「}」、「)」、または「]」を削除する(問題のある行でのみ動作)

sed - 一致しない「}」、「)」、または「]」を削除する(問題のある行でのみ動作)

行が多いファイルがあります。

一部の行は一致しない中括弧で終わります(例: " }")。

これは、以下を含む行でのみ機能します。".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

関連情報