Sostituendo la prima occorrenza di un modello in una linea, per tutte le linee in un file con sed


16

È possibile farlo in una fodera?

Ho un output come questo:

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

Questo input viene generato automaticamente.

Voglio sostituire la prima occorrenza di "(virgolette + spazio) con "(virgolette) per ogni riga. Se si applica la sostituzione globalmente, cambierà anche ogni occorrenza di line" -a line"-, quindi mi chiedevo se è possibile utilizzare un sed uno di linea per raggiungere questo.

Ho provato a usare in ^questo modo

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

Ma non funziona, non sostituisce nulla. Provai

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

e sostituisce tutte le occorrenze. Ho appena iniziato a usare sed, quindi non so davvero se sto facendo qualcosa di sbagliato.

Cosa mi sto perdendo qui?


Una nota sulle etichette: il comando che hai scritto sopra potrebbe funzionare in alcune implementazioni sed, ma per la portabilità e per evitare errori davvero strani, dovresti terminare un dato argomento di comando dopo un'etichetta (se ne hai bisogno). Ad esempio,sed -e ':a' -e 'N;$!ba' -e 'whatever'
Wildcard l'

Risposte:


34

Lo stai pensando troppo. sedsostituisce solo la prima istanza su una linea di default (senza il /gmodificatore), anche se si desidera ancora ancorare perché non si desidera tanto la prima istanza nella riga come quella all'inizio della riga; e di solito non hai bisogno delle azioni esplicite che stai cercando di usare (perché?).

sed 's/^" /"/'

Grazie! Ho pensato che fosse necessario dichiarare esplicitamente le azioni di linea quando si lavora su un file, leggere su di esso e continuare a usarle. Ci stavo davvero pensando troppo, non poteva essere più semplice e fa il trucco :)
Steve B.

Sono tentato di dire che quei comandi sono praticamente obsoleti; è possibile fare cose multilinea piuttosto complesse con loro, ma non è facile farlo e in questi giorni stai davvero meglio usando perl / python / ruby ​​/ qualunque cosa invece.
Geekosaur

Completamente in disaccordo con il commento sopra; sedcomandi multi-linea come Ned etichette come :anon sono affatto obsoleti e sono portatili e specificati POSIX , a differenza di Perl / Python / Ruby / qualunque cosa. È vero, tuttavia, se ti accorgi di averne bisogno spesso, dovresti imparareawk .
Wildcard l'

2

Una risposta più generale, dal momento che non posso commentare la risposta del geekosaur: non inseriresti il ​​^ (inizio dell'ancoraggio di linea). Ad esempio, se si desidera sostituire la prima occorrenza di A con B, si dovrebbe

sed 's/A/B/'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.