Pregunta sed: reemplazo en el lugar simultáneo e impresión de líneas cambiadas?


Digamos que tengo este archivo:

cat > test.txt <<EOF
line one word
line two word
line three word
line one two word
EOF

Y digamos que quiero reemplazar todas las palabras 'dos' con 'DOS', en línea  en su lugar en el archivo test.txt.

Ahora, lo que hago, generalmente es construir una "vista previa" (con -n no imprimir líneas, y luego con /p - imprimir solo líneas coincidentes):

$ sed -n 's/two/TWO/gp' test.txt 
line TWO word
line one TWO word

... y luego normalmente ejecuto el reemplazo real en el lugar (con -i, y sin /p)

$ sed -i 's/two/TWO/g' test.txt
$ cat test.txt 
line one word
line TWO word
line three word
line one TWO word

¿Hay alguna manera de obtener sed para cambiar ambas líneas en el lugar en un archivo, y imprimir las líneas modificadas a stdout, desde una sola línea de comando?


6
2017-11-23 02:57


origen


Respuestas:


En Linux, puede ser capaz de salirse con la suya con:

sed -i '/two/{s/two/TWO/g; w /dev/stdout}' test.txt

En los sistemas BSD (incluido Mac OS X), donde el sed tiene reglas ligeramente excéntricas sobre cuándo puedes combinar acciones en una sola línea, tuve que usar:

sed -i '/two/{s/two/TWO/g; w /dev/stdout
       }' test.txt

8
2017-11-23 03:14