Sed 可不可以搜索&;如果仅在一行的一部分匹配,则替换匹配?
下面的sed将准确输出输入。我要做的是将第一个匹配组(\1)中出现的所有uu替换为-,但不替换第二个匹配组中出现的。这可能吗Sed 可不可以搜索&;如果仅在一行的一部分匹配,则替换匹配?,sed,Sed,下面的sed将准确输出输入。我要做的是将第一个匹配组(\1)中出现的所有uu替换为-,但不替换第二个匹配组中出现的。这可能吗 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命令,但如果有必要,我会求助于awk 编辑:对RE的小修正您
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命令,但如果有必要,我会求助于awk
编辑:对RE的小修正您可以使用
awk
而不是sed
,如下所示:
echo 'abc_foo_bar=one_two_three' | awk -F= -vOFS== '{gsub("_", "-", $1); print $1, $2}'
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
abc-foo-bar=one_two_three
您可以在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
您可以使用
ghc
代替sed
,如下所示:
echo 'abc_foo_bar=one_two_three' | awk -F= -vOFS== '{gsub("_", "-", $1); print $1, $2}'
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
abc-foo-bar=one_two_three
这可能适合您:
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
你真的是你想要的吗?我希望
\([^=]*])\(=.*\)
。这就是我的答案,但如果需要可以调整。你是对的,我更新了问题以反映这一点。谢谢。我想答案应该在保留区,我只是不知道怎么用,因为我以前没有用过。谢谢:)至少它比任何sed
可能的乱七八糟的东西都可读。哈哈,不错。虽然要求人们安装Haskell编译器会让我在办公室里不受欢迎:)