H¿Cómo reemplazo una esclavitud con otra esclavitud en todos los archivos? Por ejemplo, el directorio ~ / foo tiene cientos de archivos de texto y me gustaría examinar la esclavitud xyz y reemplazarla con abc. Necesito usar sed o cualquier otra utensilio para reemplazar todas las apariciones de la palabra en sistemas operativos Linux y tipo Unix. ¿Cómo reemplazamos palabras en archivos?
El comando sed está diseñado para este tipo de trabajo, es proponer, apañarse y reemplazar cadenas o palabras de un archivo de texto en sistemas operativos Apple OX, * BSD, Linux y UNIX. Perl además se puede utilizar como se describe a continuación para reemplazar una esclavitud con otra esclavitud / palabra en todos los archivos.
Tabla de Contenidos
Cómo usar el comando sed para reemplazar una esclavitud con otra esclavitud
La sintaxis es la sucesivo:sed -i 's/old-word/new-word/g' *.txt
El comando GNU sed puede editar archivos en su circunstancia (hace una copia de seguridad si se proporciona la extensión) usando el -I opción. Si está utilizando una lectura antigua del comando sed de UNIX, pruebe la sucesivo sintaxis:sed 's/old/new/g' input.txt > output.txt
los - La opción además se conoce como reemplazar en su circunstancia. Podemos usar la sintaxis sed antigua conexo con bash for loop de la sucesivo forma:
#!/bin/bash OLD="xyz" NEW="abc" DPATH="/home/you/foo/*.txt" BPATH="/home/you/bakup/foo" TFILE="/tmp/out.tmp.$$" [ ! -d $BPATH ] && mkdir -p $BPATH || : for f in $DPATH do if [ -f $f -a -r $f ]; then /bin/cp -f $f $BPATH sed "s/$OLD/$NEW/g" "$f" > $TFILE && mv $TFILE "$f" else echo "Error: Cannot read $f" fi done /bin/rm "$TFILE"
Una nota sobre el personaje de Bash Escape
Una mostrador invertida no entre comillas es el carácter de escape Bash. Conserva el valencia textual del sucesivo carácter que sigue, con la excepción de la nueva término. Si aparece un par newline y la mostrador invertida en sí no está entrecomillada, newline se negociación como una continuación de término (es proponer, se elimina del flujo de entrada y se ignora efectivamente). Esto es útil cuando le gustaría trabajar con rutas de UNIX. En este ejemplo, el comando sed se usa para reemplazar la ruta de UNIX «/nfs/apache/logs/rawlogs/access.log» con «__DOMAIN_LOG_FILE__»:
#!/bin/bash ## Our path _r1="/nfs/apache/logs/rawlogs/access.log" ## Escape path for sed using bash find and replace _r1="${_r1/////}" # replace __DOMAIN_LOG_FILE__ in our sample.awstats.conf sed -e "s/__DOMAIN_LOG_FILE__/${_r1}/" /nfs/conf/awstats/sample.awstats.conf > /nfs/apache/logs/awstats/awstats.conf # call awstats /usr/bin/awstats -c /nfs/apache/logs/awstats/awstats.conf
El $ _r1 se escapa usando la sintaxis de sustitución de parámetro bash find and replace para reemplazar cada ocurrencia de / con /.
Reemplazar una subcadena por otra esclavitud en shell
Supongamos que necesita apañarse ‘/ foo / bar’ y reemplazarlo con ‘/ home / bar’. Esto es lo que hacemos en sed:sed 's+/foo/bar+/home/bar+g' input
sed 's+/foo/bar+/home/bar+g' input > output
sed -i'.Bak' 's+/foo/bar+/home/bar+g' input
Usamos el + en vez de / como delimitador para evitar errores. Consulte “cómo usar sed para apañarse y reemplazar texto en archivos en el shell de Linux / Unix” para obtener más información.
Reemplazar cadenas en archivos solo con operadores de manipulación de cadenas bash
No es necesario utilizar sed o Perl. Podemos reemplazar la primera aparición de un patrón / esclavitud con una esclavitud dada. La sintaxis es para bash lectura 4.x +:
${variable/pattern/string} ${variable/find/replace} # Find and replace all occurrences # ${variable//pattern/string}
Por ejemplo, reemplace una esclavitud ‘Unix’ con ‘Linux’:
x="I love Linux" echo "${x/Linux/Unix}"
Aquí hay otro ejemplo de manipulación de cadenas bash que reemplaza todas las apariciones de ‘Linux’ con ‘Unix’:
message="I love Linux. Linux is awesome but FreeBSD is better too. Try it out." updated="${message//Linux/Unix}" echo "OLD: $message" echo "NEW: $updated"
Consulte «Cómo utilizar la sustitución de parámetros de Bash como un profesional» para obtener más información sobre bash kung fu.
Reemplazo de una esclavitud en un archivo en la variable Bash cuando se usa sed
A menudo, nuestros scripts de shell tienen variables y necesitamos advenir esas variables a sed. Por ejemplo:
# # Examples that shows how to use variables as replace and search values # using both sed and Bash # find='/nfsroot' replace='/efsroot' sed -i'.backup' "s+${find}+${replace}+g" input.txt ## or test it on string ## string='AWS config for shared storage location: /nfsroot' sed "s+${find}+${replace}+g" <<<"$string" ## how about pure bash string manipulation with variables? ## find='/nfsroot' replace='/efsroot' string='AWS config for shared storage location: /nfsroot' echo "Current string: $string" echo "Updated string: ${string/${find}/${replace}}"
Cómo reemplazar una matriz de títulos usando sed
Usemos el comando cat para ver nuestro archivo de plantilla contemporáneo que contiene la configuración de información de AWS RDS para la aplicación PHP:cat config_template.txt
Herer es lo que tengo:
define('RDS_EC2_DB_NAME', '__NAME__'); define('RDS_EC2_DB_USER', '__USER__'); define('RDS_EC2_DB_PASSWORD', '__PASSWORD__'); define('RDS_EC2_DB_CLUSER_IP', '__HOST__');
Mi tarea es reemplazar ‘__NOMBRE__‘y otros títulos de contador de posición mediante el script bash:
#!/bin/bash input="config_template.txt" output="rds.db_conf.php" # Build php config file for my app echo '<?php' > "$output" cat "$input" >> "$output" # Define a new bash array. Format is: # [search_string]=replace_value declare -A rds_secrets rds_secrets=( [__USER__]=myysql_db_user_foo [__NAME__]=mysql_db_name_bar [__PASSWORD__]=my_complex_password_goes_here [__HOST__]=xyz.us-east-1.rds.amazonaws.com ) # # Do find and replace on $output while reading # AWS RDS connection info from rds_secrets() bash array # for s in "${!rds_secrets[@]}" do find="$s" replace=${rds_secrets[$s]} sed -i "s/${find}/${replace}/g" "$output" done # Close PHP config file brackets echo '?>' >> "$output"
Cómo reemplazar una esclavitud en un archivo en Perl
los perl -pi -e La sintaxis para apañarse y reemplazar una esclavitud es la sucesivo:perl -pi -e 's/old-word/new-word/g' input.file
perl -pi -e 's/old/new/g' *.conf
Dónde,
- -pag : ejecutar como sed
- -I : editar archivo en su circunstancia
- -mi : Software Perl de una término
Cuando se ejecute Perl, buscará todos los archivos que coincidan * .conf. Entonces ejecutará el patrón de reemplazo ‘s / envejecido / nuevo / g‘. En otras palabras, usamos expresiones regulares de Perl para reemplazar todas las apariciones de envejecido con nuevo.
Resumiendo
En este tutorial, aprendimos cómo usar sed, bash y Perl para apañarse y reemplazar cadenas en uno o varios archivos. Consulte las páginas de manual para obtener más información:
man bash man sed man perl man perlre