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 grep
no 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 grep
resultados, y también el /home/user/DATAFILE.DAT
archivo, 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.