unix - sustituir - sed ''s///g''
Lote reemplazar texto dentro de archivo de texto(Linux/OSX Commandline) (2)
Tengo cientos de archivos en los que necesito cambiar una parte de su texto.
Por ejemplo, quiero reemplazar cada instancia de "http: //" con "rtmp: //".
Los archivos tienen la extensión .txt y están distribuidos en varias carpetas y subcarpetas.
Básicamente, estoy buscando un camino / script que atraviese cada una de las carpetas / subcarpetas y cada archivo y si encuentra dentro de ese archivo la aparición de "http" para reemplazarlo por "rtmp".
Aquí hay una función zsh
que uso para hacer esto:
change () {
from=$1
shift
to=$1
shift
for file in $*
do
perl -i.bak -p -e "s{$from}{$to}g;" $file
echo "Changing $from to $to in $file"
done
}
Hace uso del agradable mecanismo Perl para crear un archivo de respaldo y modificar el archivo nominado. Puede usar lo anterior para iterar a través de los archivos así:
zsh$ change http:// rtmp:// **/*.html
o simplemente póngalo en un guión trivial #!/bin/zsh
(simplemente uso zsh para el poderoso globbing)
Puedes hacer esto con una combinación de find
y sed
:
find . -type f -name /*.txt -exec sed -i.bak ''s|http://|rtmp://|g'' {} +
Esto creará copias de seguridad de cada archivo. Le sugiero que revise algunos para asegurarse de que hizo lo que desea, luego puede eliminarlos usando
find . -name /*.bak -delete