¿Qué herramienta de línea de comandos de GNU / Linux utilizaría para realizar una búsqueda y reemplazar un archivo?
Pregunta
¿Qué herramienta de línea de comandos de GNU / Linux utilizaría para realizar una búsqueda y reemplazar un archivo?
¿Se puede especificar el texto de búsqueda y el reemplazo en un formato de expresiones regulares?
Solución
sed 's/a.*b/xyz/g;' old_file > new_file
GNU sed (que probablemente tenga) es aún más versátil:
sed -r --in-place 's/a(.*)b/x\1y/g;' your_file
Aquí hay una breve explicación de esas opciones:
-i [SUFFIX], --in-place [= SUFFIX] editar archivos en su lugar (hace una copia de seguridad si se proporciona la extensión)
-r, --regexp-extended use expresiones regulares extendidas en el script.
La versión FreeBSD también admite estas opciones. El NetBSD y OpenBSD las versiones solo admiten -r
.
Si desea obtener más información sobre sed, Cori ha sugerido este tutorial .
Otros consejos
Perl fue inventado para esto:
perl -pi -e 's/foo/bar/g;' *.txt
Cualquier patrón normal /// en esas comillas simples. Puedes mantener una copia de seguridad con algo como esto:
perl -pi.bak -e 's/foo/bar/g;' *.txt
O tubería:
cat file.txt | perl -ne 's/foo/bar/g;' | less
Pero ese es realmente el trabajo de sed.
Considere a Ruby como una alternativa a Perl. Robó la mayoría de los argumentos de línea de comandos de Perl ( -i
, -p
, -l
, -e
, -n
) y se configura automáticamente $ _
para que usted, al igual que Perl, tenga mucha bondad de expresiones regulares. Además, la sintaxis de Ruby puede ser más cómoda y fácil de leer o escribir que la de Perl o la de sed. (O no, dependiendo de tus gustos).
ruby ??-pi.bak -e '$ _. gsub! (/ foo | bar /) {| x | x.upcase} '* .txt
vs.
perl -pi.bak -e 's / (foo | bar) / \ U \ 1 / g' * .txt
En muchos casos, cuando se trata de one-liners, el rendimiento no es lo suficientemente importante como para preocuparse de si usa Perl de peso ligero o pesado o Perl o Ruby más pesado. Usa lo que sea más fácil de escribir.
sed , el editor de secuencias, y sí, usa expresiones regulares.