2011-07-08 10 views
5

ファイル内のすべての行の形式を変更し、一致するグループのいずれかで別の置換を実行したいとします。sedの置換をネストする方法はありますか?

例として、別の形式で入力したい3列の単純なCSVファイル(エスケープなし)を使用できます。

sed -r 's/^([a-z]+),([a-z]+),([a-z]+)$/\1: \3 (\2)' 
# would turn "comma,separated,values" 
# into  "comma: values (separated)" 

しかし、私はまた、すなわち\2s/[aeiou]//gを実行して、第二のカラムからすべての母音を削除したい

入れ子の入れ子のこの問題を解決する良い方法はありますか?両方の置換が複雑で、これは単なる例であると仮定してください。

私のsedはGNU sedバージョン4.0ではありません。

+0

もう1つのsedにパイプを通すことはできませんか? – NorthGuard

+0

@inTide:_all_母音を削除したくない。母音は2番目の列から削除するだけだ。 – Tim

+0

そうですね、カンマとセカンドの間のすべての母音を最初に削除するには、最初のカンマ ':'と2番目のカンマ '()'を作成します。 – NorthGuard

答えて

0

フィールドの操作を簡単にするために、これはawkの方が良いと思います。

echo "gaviidae,gruidae,picidae" | awk -F "," '{gsub(/[aeiou]/, "", $2); printf("%s: %s (%s)\n", $1, $3, $2)}' 

出力:

gaviidae: picidae (grd) 
+0

私はawkを知らない。 'sed'に似た方法で簡単にマッチする方法はありますか?あなたのコマンドは '、'に分割されているようですので、あまり一般的ではありません。 – Tim

+0

フィールドの区切り文字は、-F引数で設定します。正規表現は受け入れますが、逆参照を使用するために書き込む方法ではありません。私はあなたのフォーマットがより複雑な解析を必要とするフィールドに分割する必要がある場合、awkはそれほど有用ではないことを認めます。 – Simon

1

これは不可解である(ほぼすべての非自明なsedのような)が、それは仕事をするだろう。変更された単語が最後に来るようにしたいという利点を利用しています。別の位置に移動したい場合は同じトリックが効きますが、コマンドはもう少し長くなります。

sed 'h;s/.*,([a-z]+),.*/(\1)/;s/[aeiou]//g;x;s/([a-z]+),[a-z]+,([a-z]+)/\1: \2 /;G;s/\n//' 

または英語で

:「他のバッファを追加し、(中央の1を落とす)単語を並べ替え、バッファを交換、母音を取り除く、2番目の単語が、すべてを殺す、ホールドバッファにコピーを保存最後に、新しい行を削除します。

関連する問題