Eu leio um arquivo linha por linha e edito cada linha e salvo essas linhas em um arquivo separado.
while read -r line
do
newline=$(echo $line | sed -r 's/\</\n/g' | sort | tr '\n' ' ')
echo "$newline" >> newfile
done < "$filename"
Mas quero substituir as linhas originais pelas $filename
novas linhas. Eu li que poderia usar cat filename... | xargs -n1 command
ou sed -i ...
, mas até agora minhas trilhas falharam.
Aqui está um exemplo de entrada:
1.e4 e5 2.Nf3 Nc6 3.
1.d4 d5 2.e4 dxe4 3.
1.e4 e5 2.Nf3 Nf6 3.
e esta é a saída esperada:
1. 2. 3. e4 e5 Nc6 Nf3
1. 2. 3. d4 d5 dxe4 e4
1. 2. 3. e4 e5 Nf3 Nf6
Responder1
Você poderia usar sponge
, como mencionado emUm programa que pode armazenar em buffer stdin ou arquivo. Você pode canalizar todo o loop para ele, da mesma forma que a entrada é redirecionada para ele:
while read -r line ; do
echo "$line" | sed -r 's/\</\n/g' | sort | tr '\n' ' ' ;
echo
done < filename | sponge filename
Com Perl, o mesmo poderia ser feito com isto (a quantidade de espaços em branco é diferente):
perl -Mlocale -i -lne 'print join " ", sort split/(?<=\.)| /' filename
Responder2
estranhoabordagem:
awk 'BEGIN{IGNORECASE=1;}{ gsub(/\./,". ", $0); split($0, w, " ");
asort(w);l=""; for(i in w) {l=l" "w[i]} print l}' file
A saída:
1. 2. 3. e4 e5 Nc6 Nf3
1. 2. 3. d4 d5 dxe4 e4
1. 2. 3. e4 e5 Nf3 Nf6
IGNORAR CASOpode ser definido na linha de comando ou em umCOMEÇARregra
split($0, w, " ");
- divide a linha em palavras separadas
asort(w);
- classifica os valores do array (palavras)
for(i in w) {l=l" "w[i]}
- concatenar palavras classificadas em uma única linha