Como posso duplicar uma linha e pesquisar e substituir a duplicata por sed?

Como posso duplicar uma linha e pesquisar e substituir a duplicata por sed?

Estou tentando duplicar linhas em um arquivo de texto que contém determinados caracteres especiais, mas na duplicata, substitua o caractere especial por caracteres ASCII "regulares". O caso de uso concreto são caracteres acentuados.

Entrada:

éva
test
frédéric

Saída desejada:

éva
eva
test
frédéric
frederic

Por enquanto posso duplicar as linhas que contém o écaractere, mas não sei como pesquisar e substituir no grupo de captura.

Aqui está o que tenho até agora:

echo 'éva\ntest\nfrédéric' | sed 's/\(.*é.*\)/&\n\1/'

Posso fazer isso com sed? Se não, ficarei feliz em trabalhar com awk...

Responder1

Você pode combinar ée aplicar vários comandos:

sed '/é/{p;s/é/e/g;}'

Para qualquer linha contendo é, isso imprime o espaço do padrão atual e, em seguida, substitui todos éos s por e(e imprime o espaço do padrão novamente).

O equivalente AWK é

awk '/é/{print; gsub(/é/, "e")}1'

sedO scomando pode reutilizar o padrão de endereço:

sed '/é/{p;s//e/g;}'

e se suas substituições forem todas substituições de um único caractere, o ycomando será mais eficiente:

sed '/é/{p;y/é/e/;}'

Responder2

$ awk '1; gsub(/é/,"e")' file
éva
eva
test
frédéric
frederic

Os usos acima:

  1. A condição idiomática verdadeira 1para fazer com que o awk execute a ação padrão de imprimir a linha atual, então:
  2. gsub()para substituir qualquer és por es e se encontrar/substituir qualquer és, então seu retorno positivo usado no contexto da condição novamente faz com que o awk execute a ação padrão de imprimir a linha atual (agora modificada).

Observe que usar o código de retorno from gsub()para nos informar se algum és foi encontrado evita que tenhamos que especificar redundantemente o mesmo regexp /é/duas vezes no comando.

Responder3

Mais uma sedopção - inspirada emawkResposta de @EdMorton

sed -n 'p;s/é/e/gp' file

Responder4

Outra opção,semelhante ao de @Stephen Kitt:

$ sed '/é/p;s/é/e/g'
éva
eva
test
frédéric
frederic

  • /é/pselecione as linhas que possuem um écaractere e imprima.
  • s/é/e/gimprima as linhas anteriores com a substituição.

informação relacionada