2012-02-10 9 views
4

以下のsedは入力を正確に出力します。私がしたいのは、最初の一致するグループ(\ 1)では_のすべての_を置換しますが、2番目のグループでは置換しません。これは可能ですか?行の一部に一致するものが見つかった場合、検索して置換することはできますか?

echo 'abc_foo_bar=one_two_three' | sed 's/\([^=]*\)\(=.*\)/\1\2/' 
abc_foo_bar=one_two_three 

だから、私は望んでいる出力は、次のとおりです。

abc-foo-bar=one_two_three 

私はあまりにも他のsedコマンドの文字列をやっているので、awkのに頼るしたくないと思いますが、私は」私がする必要があればそれに頼るでしょう。

編集:マイナー修正に再

+0

REは本当にあなたの意図ですか?私は '\([^ =] *))\(=。* \)'を期待していました。それは私の答えに基づいていますが、必要に応じて調整することができます。 –

+0

あなたが正しいです、私はこれを反映するために質問を更新しました。ありがとう。 –

答えて

3

あなたがこれを行うことができます保留スペースを使用してsedで:

$ echo 'abc_foo_bar=one_two_three' | sed 'h; s/[^=]*//; x; s/=.*//; s/_/-/g; G; s/\n//g' 
abc-foo-bar=one_two_three 
次のように
+0

私は答えが何とかホールドスペースにあると思っていましたが、以前はそれを使用していなかったように見えませんでした。ありがとうございました:) –

1

次のようにあなたが代わりにsedawkを使用することができます。

echo 'abc_foo_bar=one_two_three' | awk -F= -vOFS== '{gsub("_", "-", $1); print $1, $2}' 

を期待通りの出力は、次のようになります。

abc-foo-bar=one_two_three 
1

あなたはghcの代わりsed使用することができます

echo "abc_foo_bar=one_two_three" | ghc -e "getLine >>= putStrLn . uncurry (++) . (map (\x -> if x == '_' then '-' else x) *** id) . break (== '=')" 

出力は、予想されるように:これはあなたのために働くかもしれない

abc-foo-bar=one_two_three 
+0

少なくとも、 "sed"可能なkludgeのどれよりも読みやすいです。 –

+1

ハハ、いいね。人々にHaskellコンパイラをインストールする必要があるにもかかわらず、私はオフィスで不評になります:) –

1

echo 'abc_foo_bar=one_two_three' | 
sed 's/^/\n/;:a;s/\n\([^_=]*\)_/\1-\n/;ta;s/\n//' 
abc-foo-bar=one_two_three 

またはこの:

echo 'abc_foo_bar=one_two_three' | 
sed 'h;s/=.*//;y/_/-/;G;s/\n.*=/=/' 
abc-foo-bar=one_two_three 
関連する問題