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'
sed
O s
comando 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 y
comando será mais eficiente:
sed '/é/{p;y/é/e/;}'
Responder2
$ awk '1; gsub(/é/,"e")' file
éva
eva
test
frédéric
frederic
Os usos acima:
- A condição idiomática verdadeira
1
para fazer com que o awk execute a ação padrão de imprimir a linha atual, então: gsub()
para substituir qualqueré
s pore
s 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 sed
opção - inspirada emawk
Resposta 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
/é/p
selecione as linhas que possuem umé
caractere e imprima.s/é/e/g
imprima as linhas anteriores com a substituição.