¿Qué hace esta línea de script de shell de Linux?

¿Qué hace esta línea de script de shell de Linux?

Estoy tratando de determinar exactamente qué está haciendo la siguiente línea de script de Shell:

grep --files-with-matches '>' . | sort | uniq | xargs perl -pi~ -e 's/9Kp/9K /' /home/user/DATAFILE.DAT

Estoy bastante seguro de que está intentando realizar una búsqueda global en '9Kp' y reemplazarla con '9K' en el archivo de datos especificado, sin embargo, no tengo claro qué está haciendo el comando grep antes de eso.

Respuesta1

grep --files-with-matches '>' .

Busque >en el directorio actual ( .) e imprima solo los nombres de los archivos coincidentes ( --files-with-matches).

Tenga en cuenta que grepno volverácualquier cosasi le asigna un directorio ( .) pero olvida habilitar el modo "recursivo". El comando correcto sería

grep --files-with-matches --recursive '>' .

o simplemente

grep -Rl '>' .

| sort
| uniq

Ordene los resultados y elimine los duplicados.

| xargs perl -pi~ -e 's/9Kp/9K /' /home/user/DATAFILE.DAT

Ejecute el comando dado ( perl ...) con cada palabra 1 de stdin pasada como argumentos adicionales.

Cada archivo de los grepresultados, y también el /home/user/DATAFILE.DATarchivo, se actualizan reemplazando el texto " 9Kp" por " 9K ". Los archivos antiguos se respaldan con una tilde al final.

1 Nota:palabra, nolínea. Esto significa que un nombre de archivo con espacios será tratado como varios nombres. xargs -d'\n'Sería mejor, aunque no perfecto.

información relacionada