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

관련 정보