¿Cómo consigo que sed lea desde la entrada estándar? [duplicar]

91

estoy intentando

grep searchterm myfile.csv | sed 's/replaceme/withthis/g'

y conseguir

unknown option to `s'

¿Qué estoy haciendo mal?

Editar:

Según los comentarios, el código es realmente correcto. Mi código completo se parecía a lo siguiente

grep searchterm myfile.csv | sed 's/replaceme/withthis/g'
# my comment

Y parece que, por alguna razón, mi comentario se introdujo como entrada en sed. Muy extraño.

deltanovember
fuente
¿Desea reemplazar su archivo con 'withthis' en lugar de replacename?
Teja
2
No, eso no es lo que estás intentando. Falta algo más.
Ignacio Vazquez-Abrams
6
Mi mejor suposición es que en tu caso real tienes un /in replacemeo withthis. Proveedores: 's#replaceme#withthis#g'.
Cababunga
4
Una cosa que está haciendo mal es no mostrarnos exactamente lo que está ejecutando. El código que muestra está bien; tiene un problema con lo que está ejecutando; ergo, no nos está mostrando lo que está ejecutando. No podemos depurar lo que no podemos ver, la mayor parte del tiempo. A veces, tendremos suerte y acertaremos, pero no deberíamos tener que adivinar o tener suerte.
Jonathan Leffler
1
Uso inútil de grep. Con sed, puede hacer: sed '/ searchterm / s / pattern / replacement / g' myfile.csv
William Pursell

Respuestas:

120

usa la opción --expression

grep searchterm myfile.csv | sed --expression='s/replaceme/withthis/g'
Ben Davis
fuente
+ SOaddict, esto solo se está enviando a stdout, no está cambiando myfile.csv.
Josiah
1
Si desea realizar una actualización in situ del archivo, creo que mi respuesta resuelve adecuadamente ese problema.
Wes
Cualquier cosa que parezca grep 'x' y | sed 'z'se puede refactorizar a sed '/x/z' y. Véase también uso inútil de grep.
triplicado
39

use "-e" para especificar la expresión sed

cat input.txt | sed -e 's/foo/bar/g'
umläute
fuente
1
Me preguntaba cómo usar "-e" para especificar la expresión sed puede hacer que sed lea desde stdin. ¿Sed lee de forma predeterminada desde stdin?
Tim
1
si. como la mayoría de las herramientas un * x, sedlee desde stdin si no hay un archivo de entrada presente.
umläute
Gracias. es -enecesario? Funciona sin -e. Me pregunto ¿cuál es el propósito de usar -e? Gracias.
Tim
2
No estoy seguro de entender la cuestión de OP. echo foo | sed 's/foo/bar/g'funciona sin -esalida bar. Así que debo haber perdido su pregunta.
Tim
No es necesario especificar -esi solo tiene una única declaración de script. Si tiene dos, puede decir sed -e '/foo/!d' -e 's//bar/g'o sed 's/foo!d;s//bar/g'(o de manera equivalente, con una nueva línea en lugar de un punto y coma).
triplicado
6

Para realizar sedcapturas desde stdin, en lugar de desde un archivo, debe usar -e.

Me gusta esto:

curl -k -u admin:admin https://$HOSTNAME:9070/api/tm/3.8/status/$HOSTNAME/statistics/traffic_ips/trafc_ip/ | sed -e 's/["{}]//g' |sed -e 's/[]]//g' |sed -e 's/[\[]//g' |awk  'BEGIN{FS=":"} {print $4}'
LeoChu
fuente
2

Si está tratando de hacer una actualización in situ de texto dentro de un archivo, esto es mucho más fácil de razonar en mi mente.

grep -Rl text_to_find directory_to_search 2>/dev/null | while read line; do  sed -i 's/text_to_find/replacement_text/g' $line; done

Wes
fuente
-16
  1. Abra el archivo usando vi myfile.csv
  2. prensa Escape
  3. Tipo :%s/replaceme/withthis/
  4. Escriba :wqy presioneEnter

Ahora tendrá el nuevo patrón en su archivo.

Teja
fuente
11
OP quería saber cómo hacerlo con sed, no con vim.
Noe Nieto
1
Lo que dijo Noe. Además, su solución vim es inferior a la (s) alternativa (s) sed, ya que no es (fácilmente) programable.
weberc2