torr - remove "}", ")" ou "]" sem correspondência (somente para a linha em questão)

2

Eu tenho um arquivo com muitas linhas.

Algumas das linhas terminam em chaves não correspondentes, por exemplo, " } "

Isso é válido apenas para linhas que contêm ".to"

Como posso remover as chaves sem correspondência com sed para TODAS as linhas que contêm uma string (" .to "), mas não tenho outra string (" { ") em qualquer lugar na linha (antes ou depois da .to ) mas terminam em " } "?

Algo como sed -i '/\.to/s/[[:space:]]*\}//' file

mas isso seria para TODAS as linhas que contêm uma string (" .to ") e terminam em " } "

Eu quero isso para linhas que não possuem chave / suporte, por exemplo { antes do }

Eu não preciso me preocupar com chaves multi-line para isso. Limitar as linhas que correspondem a uma pesquisa ('.to' neste caso) ajuda a evitar isso.

por exemplo,

  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 }
    
por Michael Durrant 27.10.2013 / 16:52

2 respostas

2

Que tal simplesmente

sed -i 's@^\([^{]\+\)\(\.to[^{]\+\)}\s*$@@' your_file

Com Perl (para melhor legibilidade):

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
    
por 27.10.2013 / 20:55
3

Com e regex avançado de look-around :

perl -lpe 's/((?<!\{).*?\.to.*)}\s*$/$1/' file

e com :

awk '!/{/ && /\.to.*}/{sub(/\}/, "", $NF)}1' file
    
por 27.10.2013 / 17:14

Tags