sed - applica le modifiche in più file


11

Ho centinaia di file che contengono " </foo:bar>"

cc
bb
aa
</foo:bar>
dd
xx
vv

Voglio cambiarli tutti in una volta

cc
bb
aa
</foo:bar>

sed funziona bene quando gli do il nome esatto del file

sed -i "/ </ foo: bar> / q" 99999.txt

ma quando provo a cambiarle tutte in una volta non ottengo alcun risultato.

 sed -i "/<\/foo:bar>/q" *.txt

Risposte:


19

Provare:

sed -s -n -i '0,/<\/foo:bar>/p' *.txt

-s dice a sed di trattare ogni file come separato.

Poiché non vogliamo seduscire fino a quando tutti i file non sono stati completati, passiamo a stampare dall'inizio <\/foo:bar>e non a stampare il resto delle righe. -ndice a sed di non stampare a meno che non lo chiediamo esplicitamente a. Il comando 0,/<\/foo:bar>/pdice a sed di stampare qualsiasi riga nell'intervallo dall'inizio del file alla prima riga corrispondente <\/foo:bar>.

L' -sopzione non è disponibile per BSD / OSX sed.


@ fd0 Grazie. Risposta aggiornata per notare la mancanza di -ssu BSD / OSX sed.
Giovanni 1024,

per GNU sed , l' -iopzione implica -s... esiste sedun'implementazione in cui questa soluzione non funzionerà senza -sopzione?
Sundeep

7

Per interrompere la lettura dei file quando </foo:bar>viene trovato:

Con GNU awk:

gawk -i inplace '{print}; $0 == "</foo:bar>" {nextfile}' ./*.txt

Con perl:

perl -ni -e 'print; close ARGV if $_ eq "</foo:bar>\n"' ./*.txt
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.