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

相关内容