Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sed 可不可以搜索&;如果仅在一行的一部分匹配,则替换匹配?_Sed - Fatal编程技术网

Sed 可不可以搜索&;如果仅在一行的一部分匹配,则替换匹配?

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的小修正您

下面的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的小修正您可以使用
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编译器会让我在办公室里不受欢迎:)