2016-04-05 17 views
0

私はsedから期待した動作を得られません。Sed複数の検索語

私が見ることができるものから、私は使用することができるはずです。

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

私は失敗したが。あなたは下の出力から見ることができます。私は "ca"を削除したいと思っていましたが、 「ca-a」検索から、部分的にしか働かなかった。私は期待

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 

出力は次のようになります。

1 
2 
3 
4 
+0

なぜforループを使ってbashの行を読み込み、それらをsedにエコーするのですか?あなたのスクリプト全体は 'sed -e 's/ca .//; s/ca-a .//'> temporary.txt'とほとんど全く同じですが、唯一の違いは 'echo'が空白を修正する点です。 –

答えて

1

あなたのパターンはまた、あなたがループを必要としない、それらを組み合わせて、より良いオーバーラップします。

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

メモ1行に複数の置換えが必要な場合は、gサフィックスを追加します。

+0

OPは、 'sed -r 's/ca(-a)?\ .//' <<<" ca.1 ca.2 ca.3 "'で何が欲しいのか明確ではありません。 –

+0

右のthx、メモを追加しました。 – karakfa

関連する問題