Sustituyendo la primera aparición de un patrón en una línea, por todas las líneas en un archivo con sed

16

¿Es posible hacerlo de una sola vez?

Tengo una salida como esta:

"First line" - Description  
" Second line" - Description  
"Third line" - Description  
" Fourth line" - Description  

Esta entrada se genera automáticamente.

Quiero reemplazar la primera aparición de "(comillas + espacio) con "(comillas) para cada línea. Si aplico la sustitución a nivel mundial, también cambiará cada aparición de line" -a line"-, por lo que me preguntaba si es posible usar un revestimiento de un solo sed para lograr esto.

He intentado usar ^así

sed -r ':a;N;$!ba;s/(\^\" )/\"/g'

Pero no está funcionando, no reemplaza nada. Lo intenté

sed -r ':a;N;$!ba;s/(^|\" )/\"/g'

y reemplaza todas las ocurrencias. Acabo de empezar a usar sed, así que no sé si estoy haciendo algo mal.

¿Que me estoy perdiendo aqui?

Steve B.
fuente
Una nota sobre las etiquetas: el comando que escribió anteriormente puede funcionar en algunas implementaciones de sed, pero para la portabilidad y para evitar errores realmente extraños, debe finalizar un argumento de comando dado después de una etiqueta (si es que los necesita). Por ejemplosed -e ':a' -e 'N;$!ba' -e 'whatever'
comodín

Respuestas:

34

Lo estás pensando demasiado. sedreemplaza solo la primera instancia en una línea de manera predeterminada (sin el /gmodificador), aunque todavía desea anclar porque no desea tanto la primera instancia en la línea como la que está al comienzo de la línea; y generalmente no necesita las acciones de línea explícitas que está tratando de usar (¿por qué?).

sed 's/^" /"/'
geekosaur
fuente
¡Gracias! Pensé que era necesario declarar explícitamente las acciones de línea cuando se trabajaba en un archivo, leer sobre él y seguir usándolo. Realmente lo estaba pensando demasiado, eso no podría ser más simple y hace el truco :)
Steve B.
Estoy tentado a decir que esos comandos son bastante obsoletos; es posible hacer cosas bastante complejas con varias líneas, pero no es fácil hacerlo y en estos días es mejor usar perl / python / ruby ​​/ lo que sea.
geekosaur
Totalmente en desacuerdo con el comentario anterior; Los sedcomandos de varias líneas como Ny las etiquetas como :ano son obsoletos en absoluto y son portátiles y POSIX especificados , a diferencia de Perl / Python / Ruby / lo que sea. Sin embargo, es cierto que si los necesita con frecuencia, debe aprenderawk .
Comodín el
2

Una respuesta más general, ya que no puedo comentar sobre la respuesta de geekosaur: no pondrías el ^ (inicio del ancla de línea). Por ejemplo, si desea reemplazar la primera aparición de A con B, tendría

sed 's/A/B/'
espectro
fuente