Traduzindo com o comando sed

1

Com o script a seguir, estou tentando ler um arquivo de texto (italian.txt) e traduzir desse arquivo todas as palavras do italiano para o inglês e salvar a saída em outro arquivo de texto (english.txt). Eu tenho que usar o comando sed com o comando global g para que eu traduza toda a aparência da palavra.

Não está funcionando corretamente, mas não sei o que deu errado. Alguém pode me ajudar?

cat italian.txt | sed -i 's/sole/sun/g' | 's/penna/pen/g' > english.txt

exit 0 
    
por Pepka 05.01.2017 / 12:08

5 respostas

6

Existem alguns problemas com o seu script:

  1. Você precisa adicionar um segundo sed após o segundo canal ( | ).
  2. sed -i informa sed para editar arquivos "no local", mas não há arquivo especificado - sed está usando stdin , vindo de cat . Você pode remover com segurança o -i e seu script deve funcionar agora.

O script fixo deve ser:

cat italian.txt | sed 's/sole/sun/g' | sed 's/penna/pen/g' > english.txt
    
por 05.01.2017 / 12:29
4

Você está usando errado.

Primeiro, você não precisa de gato. sed pode pegar o nome do arquivo para ler. Assim:

sed 's/sole/sun/g' italian.txt

Segundo, você não precisa redirecionar o pipe para a próxima sed -expressão. Se você precisar, deve ser assim:

sed 's/sole/sun/g' italian.txt | sed 's/penna/pen/g' > english.txt

, mas é um trabalho extra. sed pode processar mais de uma expressão. Você pode dividi-los por «;» ou fornecê-los a sed como argumentos da linha de comando com -e antes de cada um.

Em suma, o comando parece assim:

sed 's/sole/sun/g; s/penna/pen/g' italian.txt > english.txt
    
por 05.01.2017 / 12:37
2

Se você tivesse um arquivo com pares de palavras, por exemplo

sole sun
penna pen

... e assim por muitas palavras em italiano e inglês (não há limite prático além da memória), então você pode criar um script sed

s/\<sole\>/sun/g
s/\<penna\>/pen/g

... (onde \<word\> corresponderá apenas à palavra word e não, por exemplo, words ou reword ) da seguinte forma:

$ awk '{ printf("s/\<%s\>/%s/g\n", $1, $2) }' pairs.txt >translate.sed

Em seguida, você pode aplicar esse script sed a um arquivo de texto:

$ sed -f translate.sed italian.txt >english.txt
    
por 05.01.2017 / 13:54
1

Não é necessário e redundante sobrescrever o conteúdo de italian.txt, pois a saída de sed está sendo redirecionada para outro arquivo chamado english.txt e salva de qualquer forma. Também é possível eliminar o uso inútil de cat

sed -e 's/sole/sun/g' -e 's/penna/pen/g' italian.txt | tee english.txt  
  • sed permite vários comutadores -e , o que permite substituir mais de uma coisa por vez.
  • tee pode ser usado para redirecionamento de dados (por exemplo, para outro arquivo chamado english.txt).
por 05.01.2017 / 12:40
0

Uma variante da ideia @Kusalanananda:

$ cat dict
sole:sun
penna:pen

$ sed -f <(sed -r 's!(.+):(.+)!s/\<\>//g!' dict)   it.txt >en.txt
    
por 05.01.2017 / 14:29

Tags