sed con expresión múltiple para discusión en el lugar

24

Estoy tratando de reemplazar varias palabras en el archivo usando sed -i #expression1 #expression2

archivo

Something  123 item1
Something  456 item2
Something  768 item3
Something  353 item4

Salida (deseada)

anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

Audiciones

Puedo obtener la siguiente salida usando sed -i2 veces.

 sed -i 's/Some/any/g' file
 sed -i 's/item/stuff/g' file

¿Puedo tener alguna forma posible de hacer esto como un solo comando en el lugar como

sed -i 's/Some/any/g' -i 's/item/stuff/g' file

Cuando probé el código anterior, se toma s/item/stuff/gcomo un archivo e intento trabajar en él ...

JigarGandhi
fuente
Si sus archivos son similares al ejemplo anterior (es decir, siguen el mismo patrón), puede hacerlo con una sola sustitución:sed - i 's/Some\(.*\)item/any\1stuff/' file
don_crissti

Respuestas:

26

Dependiendo de la versión de sedsu sistema, puede hacer

sed -i 's/Some/any/; s/item/stuff/' file

No necesita gdespués de la barra final en el scomando aquí, ya que solo está haciendo un reemplazo por línea.

Alternativamente:

sed -i -e 's/Some/any/' -e 's/item/stuff/' file

La -iopción le dice sedque edite los archivos en su lugar; si hay caracteres inmediatamente después, -iluego sedrealiza una copia de seguridad del archivo original y usa esos caracteres como la extensión del archivo de copia de seguridad. P.ej,

sed -i.bak 's/Some/any/; s/item/stuff/' file

o

sed -i'.bak' 's/Some/any/; s/item/stuff/' file

modificará file, guardando el original en file.bak.

Por supuesto, en un sistema Unix (o similar a Unix), normalmente usamos '~' en lugar de '.bak', por lo que

sed -i~ 's/Some/any/;s/item/stuff/' file
PM 2Ring
fuente
2
Tenga en cuenta que está describiendo la variante GNU. La variante BSD (como en FreeBSD o OS / X) requiere un argumento para -i. Así que sed -i '' 's/a/b/;s/c/d/' fileo sed -i .back 's/a/b/;s/c/d/'o sed -i.back 's/a/b/;s/c/d/'no. Otras sedimplementaciones generalmente no son compatibles -i.
Stéphane Chazelas
Gracias @ StéphaneChazelas por aclarar eso. Y supongo que debería haber sido más explícito al decir que en GNU sed no puede haber un espacio entre -iy la extensión.
PM 2Ring
sed -i 's/$username = "root"/$username = "newuser"/; s/$password = "password"/$password = "passwd"/; s/$dbname="handicraftstore"/$dbname="handicraft"' Web/database.phpresultados sed: -e expression #1, char 141: unterminated '
comando
@alhelal Lo sentimos, los comentarios no son el lugar adecuado para hacer preguntas. Pero de todos modos, a tu último scomando le falta el final /.
PM 2Ring
@ PM2Ring ya que no me di cuenta de que supuse que está relacionado con su solución. Sin embargo, gracias.
alhelal
10

Puede encadenar expresiones sed junto con ";"

%sed -i 's/Some/any/g;s/item/stuff/g' file1
%cat file1
anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4
Ian McGowan
fuente
5

Expresión múltiple usando múltiples -eopciones:

sed -i.bk -e 's/Some/any/g' -e 's/item/stuff/g' file

o puedes usar solo uno:

sed -i.bk -e 's/Some/any/g;s/item/stuff/g' file

Debe dar una extensión para el archivo de respaldo, ya que cuando alguna implementación de sed, como OSX sed , no funciona con una extensión vacía (debe usar sed -i ''para anular los archivos originales).

Cuonglm
fuente
1

Puede usar Vim en modo Ex:

ex -sc '%s/Some/any/|%s/item/stuff/|x' file
  1. % seleccione todas las líneas

  2. s sustituir

  3. x guardar y cerrar

Steven Penny
fuente