2012-05-16 22 views
16

Ho un file con il seguente contenuto:sostituire una stringa sconosciuta tra due stringhe conosciute con sed

WORD1 WORD2 WORD3

Come posso usare sed per sostituire la stringa tra le WORD1 e WORD3 con foo, in modo tale che il contenuto del file vengono modificati al seguente ?:

WORD1 foo WORD3

ho provato quanto segue, ma ovviamente mi manca qualcosa perché questo non produce i risultati desiderati:

sed -i '' 's/WORD1.*WORD3/foo/g' file.txt

+0

Ci potrebbe essere qualcosa del tipo ' WORD1 foo WORD3 bar WORD1 baz WORD3' nella tua stringa (i. e. più di una partita per stringa)? –

+0

Ah - buona domanda, ma no, non è davvero necessario ospitare più di una partita in questo scenario. –

risposta

15
sed -i 's/WORD1.*WORD3/WORD1 foo WORD3/g' file.txt 

o

sed -i 's/(WORD1).*(WORD3)/\1 foo \2/g' file.txt 

Potrebbe essere necessario per sfuggire parentesi tonde, dipende dal vostro variante sed.

+0

Cosa devo fare per consentire a WORD1, WORD2 e WORD3 di essere qualsiasi stringa? –

+0

@ValeriyVan, devi sfuggire delimitare i caratteri nelle tue WORD ('/' nel mio esempio) così come tutti gli altri caratteri, che 'sed' considera come controllanti. – vyegorov

2

contenuto di un campione file.txt

$ cat file.txt 
WORD1 WORD2 WORD3 
WORD4 WORD5 WORD6 
WORD7 WORD8 WORD9 

(Correzione da @DennisWilliamson nel commento)
$ sed -e 's/\([^ ]\+\) \+\([^ ]\+\) \+\(.*\)/\1 foo \3/' file.txt

WORD1 foo WORD3 
WORD4 foo WORD6 
WORD7 foo WORD9 

mentre awk è in qualche modo più semplice

$ awk -F' ' '{ print $1" foo "$3 }' file.txt

WORD1 foo WORD3 
WORD4 foo WORD6 
WORD7 foo WORD9 
+1

Non è necessario uscire da nessuno degli spazi. E '[^ \]' significa "qualsiasi carattere diverso dallo spazio o dal backslash. Suggerirei' \ + 'invece di' * 'dato che, come è, il tuo comando potrebbe sostituire una riga vuota. Inoltre' g' non è necessario - come è il reindirizzamento –

+0

@DennisWilliamson, apprezza il tuo commento, grazie – Rony

+0

Ora non funzionerà affatto Hai frainteso cosa intendevo. 'sed -e 's/\ ([^] \ + \) \ + \ ([^] \ + \) \ + \ (. * \)/\ 1 pippo \ 3/'file.txt' –

5

Questo potrebbe funzionare per voi:

sed 's/\S\+/foo/2' file 

o forse:

sed 's/[^[:space:]][^[:space:]]*/foo/2' file 

Se WORD1 e WORD3 si verificano più di una volta:

echo "WORD1 WORD2 WORD3 BLA BLA WORD1 WORD4 WORD3" | 
sed 's/WORD3/\n&/g;s/\(WORD1\)[^\n]*\n/\1 foo /g' 
WORD1 foo WORD3 BLA BLA WORD1 foo WORD3 
+0

'[^ [: spazio:]] [^ [: spazio :]] * 'può essere sostituito da' [^ [: space:]] \ + '(come hai usato nel tuo primo esempio) in alcune versioni di' sed'. '/ 2' è un bel tocco. + 1 –

Problemi correlati