2011-11-17 21 views
8

ho semplicemente voglio fare doposostituzione modello di linea multipla in sed

sostituire

EXTRATHING { 
}; 

da

SOMETHING {}; 

in inputfile. Per questo, ho provato

sed -e 's/EXTRATHING {\n};/SOMETHING/' input_file.txt >outfile.txt 

Questo non funziona. Qualcuno può suggerire quale sarebbe il modo corretto di farlo con sed?

risposta

5
sed -n '1h;1!H;${;g;s/EXTRATHING {\n};/SOMETHING {};/g;p;}' input_file.txt 

lo farebbe.

Il problema di questo è che memorizza la stringa di input intera in tampone di sed.

Vedi sed and Multi-Line Search and Replace per ulteriori informazioni, e una versione più efficiente.

0

Questo potrebbe funzionare per voi:

sed '/^EXTRATHING {/,/^};/c\SOMETHING{}' input_file.txt >output_file.txt 

o se si desidera modificare il file originale:

sed -i '/^EXTRATHING {/,/^};/c\SOMETHING{}' input_file 

EDIT: come richiesto ecco un esempio:

cat <<! | sed '/^EXTRATHING {/,/^};/c\SOMETHING{}' 
> aaa 
> EXTRATHING { 
> }; 
> bbb 
> EXTRATHING { 
> }; 
> ccc 
> ! 
aaa 
SOMETHING{} 
bbb 
SOMETHING{} 
ccc 

EDIT : Se il primo e l'ultimo indirizzo sono linee consecutive, utilizzare questo:

# cat <<\! | sed '/^EXTRATHING {/{N;s/^EXTRATHING {\n};/SOMETHING{}/}' 
> aaa 
> EXTRATHING { 
> bbb 
> }; 
> ccc 
> EXTRATHING { 
> }; 
> ddd 
> ! 
aaa 
EXTRATHING { 
bbb 
}; 
ccc 
SOMETHING{} 
ddd 

Un altro modo (forse più facile?):

echo -e "EXTRATHING {\n};" | sed '$!N;s/^EXTRATHING {\n};/SOMETHING {};/;P;D' 
SOMETHING {}; 
+0

cura di inviare il vostro esempio che questo funziona ;-)? Ho appena ricevuto il documento originale restituito .. Buona fortuna. – shellter

+0

Grazie @potong. Tuttavia, il comando sarà anche rimuovere il modello originale, se ci sono alcune altre linee tra "EXTRATHING {" e "};". Non voglio che vengano sostituiti.Quindi, il seguente non dovrebbe essere sostituito "EXTRATHING {\ n something \ n};". – bbv

+0

Grazie, vedo il tuo codice funziona con il sed 4 *, ma non con la versione non versione che ho in UWIN. Stai usando un'espressione di intervallo per catturare le due linee? cioè '/ x /,/y /'? Buona fortuna a tutti. – shellter

3

sed -e '/begin/,/end/{s/begin/replacement/p;d}'

+4

Puoi spiegare questo per favore? Grazie. :) – Ray

+1

Penso che fosse basato su una cattiva comprensione della domanda. – BCS

3
sed -i.bak '/EXTRATHING/{N;s//SOMETHING/;s/\n//}' input_file.txt 
1
perl -lne 's/\s*};\s*$/SOMETHING{};/g if(/\s*};\s*$/);$f=0;if(/EXTRATHING {\s*$/){next;$f=1}else{print}' your_file 

testati sotto:

> cat temp 
fjbwjfbw 
wefjkbwjk 
jbefwejr 
EXTRATHING { 
}; 
ghekg 
jhgjk 
wefjkwngk 
EXTRATHING { 
    }; 
jbgvjnrg 
jbfw 
wefnkwk 
EXTRATHING { 
}; 
> perl -lne 's/\s*};\s*$/SOMETHING{};/g if(/\s*};\s*$/);$f=0;if(/EXTRATHING {\s*$/){next;$f=1}else{print}' temp 
fjbwjfbw 
wefjkbwjk 
jbefwejr 
SOMETHING{}; 
ghekg 
jhgjk 
wefjkwngk 
SOMETHING{}; 
jbgvjnrg 
jbfw 
wefnkwk 
SOMETHING{}; 
> 

se si desidera modificare il file in linea . aggiungi un flag -i. come:

perl -i -lne '.......' your_file 
0

E 'difficile farlo in sed, ha bisogno di scrivere gli indici. Tuttavia, è possibile utilizzare uno-liner utilizzando perl:

perl -0777 -pe 's/EXTRATHING {\n/SOMETHING {/g' input_file.txt > outfile.txt 

dove -0777 è separatore di record (linea di fondo campo in file di testo) -p corre di comando per tutti i file e le stampe su schermo -e dice il suo uno riga di comando

Problemi correlati