2016-04-05 14 views
0

Ich bekomme nicht das Verhalten, das ich von sed erwartet.Sed mehrere Suchbegriffe

Von dem, was ich sehen kann, sollte ich in der Lage sein zu verwenden:

sed -e 's/findfirsthing/replace/;s/findsecondthing/replace/' 

Jedoch habe ich nicht erfolgreich war. Wie Sie aus der Ausgabe unten sehen können. Obwohl ich "ca." entfernen wollte und "ca-a". Von der Suche hat es nur teilweise funktioniert.

macbook:labs alex$ cat ca_vip.txt 
ca.1 
ca-a.2 
3 
4 

macbook:labs alex$ cat vip.sh 
#!/bin/bash 
    for line in `cat ca_vip.txt` 
     do 
     if [[ $line =~ [ca.*] || [ca-a.*] ]] 
     then 
      echo $line | sed -e 's/ca.//;s/ca-a.//' >> temporary.txt 
       elif [ $line != [ca.*] || [ca-a.*] ] 
      then 
      echo $line >> temporary.txt 
     fi 
    done 

macbook:labs alex$ ./vip.sh 

macbook:labs alex$ cat temporary.txt 
1 
a.2 
3 
4 

Der Ausgang ich erwarten würde ist:

1 
2 
3 
4 
+0

Warum verwenden Sie eine for-Schleife, um die Zeilen in bash zu lesen und sie an sed zu senden? Dein gesamtes Skript ist fast genau äquivalent zu 'sed -e 's/ca .//; s/ca-a ./' 'temporary.txt', der einzige Unterschied ist, dass' echo 'Leerzeichen ändert. –

Antwort

1

Ihre Muster überlappen, besser, sie zu kombinieren, auch brauchen Sie nicht die Schleifen.

$ sed -r 's/ca(-a)?\.//' ca_vip.txt 
1 
2 
3 
4 

note add g Suffix, wenn Sie mehrere Auswechslungen pro Zeile möchten.

+0

OP ist nicht klar, was er will mit 'sed -r 's/ca (-a)? \ .//' <<<" ca.1 ca.2 ca.3 "'. –

+0

richtig thx, Hinweis hinzugefügt. – karakfa