Substitui um padrão que termina em nova linha com o mesmo padrão sem a nova linha

1

Eu tenho um arquivo javascript com duas novas linhas depois de uma determinada palavra "[FACT]", quero substituí-lo por uma nova linha. Eu preciso fazer isso no script bash. Normalmente, eu teria usado sed , mas acontece que sed não é bom para lidar com novas linhas na entrada. (Corrija-me se eu estiver enganado).

Para fazer isso programaticamente, eu posso empregar shell script ou javascript / Java etc. para esse propósito, mas o que será uma boa solução do ponto de vista da engenharia de software (manutenibilidade, portabilidade etc.).

sed 's/\[FACT\]\/n/\[FACT\]/g' file.js
    
por Asad Iqbal 30.10.2013 / 23:32

2 respostas

3

Portabilidade? Processamento de texto? Perl, claro:

perl -n0777e 's{\n+}{\n}g' your_file

onde -0777 instrui o Perl a ler o arquivo inteiro de uma só vez, para que novas linhas sucessivas possam ser encontradas pelo Perl.

O texto acima removeria todas as novas linhas duplicadas. Para remover somente aqueles após [FACT] , você pode fazer:

perl -n0777e 's{\[FACT\]\n+}{\n}g' your_file
    
por 30.10.2013 / 23:57
0

Estou assumindo que "duas novas linhas" significam \n\n e não duas linhas em branco seguindo a linha com [FACT] (que seriam três novas linhas). De qualquer forma, o sed funcionará, uma vez que remove apenas a primeira nova linha após [FACT] .

$ echo -e '[FACT]\n\nend'
[FACT]

end

Isso irá procurar as linhas que terminam em [FACT] e para cada linha que corresponda usamos N para acrescentar a próxima linha ao espaço padrão atual, mantendo a nova linha que sed geralmente remove do espaço padrão.

$ echo -e '[FACT]\n\nend' |sed '/\[FACT\]$/ { N; s/\n// }'
[FACT]
end

Se [FACT] não precisa estar exatamente no final da linha, remova o $ do comando.

Por favor, note que isso tecnicamente retira a nova linha do final da linha que contém [FACT] , então concatena tecnicamente duas linhas em uma:

$ echo -e '[FACT]\nhelp\nend' 
[FACT]
help
end

$ echo -e '[FACT]\nhelp\nend' |sed '/\[FACT\]$/ { N; s/\n// }'
[FACT]help
end
    
por 31.10.2013 / 04:57

Tags