Tutoriales

Bash Reemplazar una esclavitud con otra esclavitud en todos los archivos usando sed

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.



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

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba