Come sostituire solo le linee che corrispondono a diversi schemi in sed?


8
$ echo -e 'CH12\nCH23au' | sed '/^CH/s=^=<b>='
<b>CH12
<b>CH23au

So di poter abbinare le linee che iniziano con CH, ^CHma come posso abbinare più pattern?

Esempio:

Ingresso:

CH12
CH23au

Produzione:

CH12
<b>CH23au

Come mettere solo <b>dove c'è ^CHe aunella linea?

Risposte:


8

Se il CHdeve accadere all'inizio della riga, l'ordine di CHe auè fisso, quindi puoi cercare ^CH.*au.

$ echo -e 'CH12\nCH23au' | sed '/^CH.*au/s=^=<b>='
CH12
<b>CH23au
$

Se l'ordine dei due modelli non è fisso, si potrebbe fare qualcosa del genere

sed -e '/pattern1/{;/pattern2/s/old/new/;}'

ma la soluzione perl

perl -pe 'if (/pattern1/ && /pattern2/) {s/old/new/;}'

è probabilmente più leggibile.


5

Un altro approccio:

sed -e '/^CH/!b' -e '/au/!b' -e 's/^/<b>/'

b(ramo fino alla fine se non viene fornito alcun argomento etichetta) è simile continueo nextin altre lingue. Quindi quanto sopra è come:

for (; line = readline(); print line) { # The implicit loop in sed
  if (!/^CH/) continue;
  if (!/au/) continue;
  line =~ s/^/<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.