2011-06-06 9 views
5

Voglio fare una sostituzione basata su un carattere jolly. Ad esempio, cambia tutto "possesso" in "disposizione" solo se la parola "possesso" viene dopo un segno "=". Fondamentalmente una regex che sarebbe partita questa =.*tenuresostituzione jolly sed

Il comando sed che ho quindi per questo è:

sed 's/=.*tenure/=.*disposition/g' file.txt 

Tuttavia, se mi passa a un file che contiene:

blah blah blah = change "tenure" to "disposition" 

ottengo

blah blah blah =.*disposition" to "disposition" 

invece di:

blah blah blah = change "disposition" to "disposition" 

Come si esegue la sostituzione in modo che il carattere jolly nell'espressione regolare non faccia parte del file di destinazione?

risposta

6

È necessario utilizzare un gruppo di cattura per catturare il testo che compare tra le segno uguale e "possesso".

Così

sed 's/=\(.*\)tenure/=\1disposition/g' 

Nota l'uso di \1 per fare riferimento e utilizzare il gruppo acquisita.

Quindi, in

echo 'blah blah blah = change "tenure" to "disposition"' | sed 's/=\(.*\)tenure/=\1disposition/g' 

otteniamo

blah blah blah = change "disposition" to "disposition". 

Vedi Regex grouping.

2
sed 's/\(=.*\)tenure/\1disposition/g' file.txt 
2

è necessario salvare i caratteri abbinati tra il = e tenure per aggiungerli l'output:

sed 's/=(.*)tenure/=\1disposition/g' file.txt 

Inoltre, si dovrebbe aggiungere l'opzione -i a sed se si desidera modificare il file inplace (fai le modifiche al file stesso).

2

È necessario utilizzare backreference in sed. Utilizzare in questo modo:

sed 's/\(=.*\)tenure/\1disposition/g'