可以搜索和搜索如果匹配仅在一部分线上,则替换匹配?

时间:2012-02-10 12:44:18

标签: sed

下面的sed将完全输出输入。我想要做的是在第一个匹配组(\ 1)中替换所有出现的_ with - ,而不是在第二个匹配组中。这可能吗?

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

所以,我希望的输出是:

abc-foo-bar=one_two_three

我不想求助于awk,因为我也在做一系列其他的sed命令,但如果必须的话,我会诉诸于此。

编辑:对RE的次要修复

4 个答案:

答案 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

答案 1 :(得分:1)

您可以使用awk代替sed,如下所示:

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

输出将如预期那样:

abc-foo-bar=one_two_three

答案 2 :(得分: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

答案 3 :(得分: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