Estou tentando determinar exatamente o que a seguinte linha de script de shell está fazendo:
grep --files-with-matches '>' . | sort | uniq | xargs perl -pi~ -e 's/9Kp/9K /' /home/user/DATAFILE.DAT
Tenho certeza de que ele está tentando fazer uma pesquisa global em '9Kp' e substituí-lo por '9K' no arquivo de dados especificado, mas não tenho certeza do que o comando grep está fazendo antes disso.
Responder1
grep --files-with-matches '>' .
Pesquise >
no diretório atual ( .
) e imprima apenas os nomes dos arquivos correspondentes ( --files-with-matches
).
Observe que grep
não retornaráqualquer coisase você fornecer um diretório ( .
), mas esquecer de ativar o modo "recursivo". O comando correto seria
grep --files-with-matches --recursive '>' .
ou simplesmente
grep -Rl '>' .
| sort
| uniq
Classifique os resultados e remova duplicatas.
| xargs perl -pi~ -e 's/9Kp/9K /' /home/user/DATAFILE.DAT
Execute o comando fornecido ( perl ...
) com cada palavra 1 de stdin passada como argumentos adicionais.
Cada arquivo dos grep
resultados, e também o /home/user/DATAFILE.DAT
arquivo, são atualizados substituindo o texto " 9Kp
" por " 9K
". O backup dos arquivos antigos é feito com um til final.
1 Nota:palavra, nãolinha. Isto significa que um nome de arquivo com espaços será tratado como vários nomes. xargs -d'\n'
seria melhor, embora não seja perfeito.