下面的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的次要修复
答案 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