假设我有'abbc'字符串,我想替换:

Ab -> BC BC -> ab

如果我尝试两次替换,结果不是我想要的:

echo 'abbc' | sed 's/ab/bc/g;s/bc/ab/g'
abab

那么我可以像下面这样使用什么sed命令来替换?

echo abbc | sed SED_COMMAND
bcab

编辑: 实际上,文本可以有超过2个模式,我不知道我需要多少替换。因为有一个答案说sed是一个流编辑器,它的替换是贪婪的,我认为我将需要使用一些脚本语言。


当前回答

用户“C: \ \圣回响。谭\我的文件夹\ project1”| sed - e ' s / C: \ \ / mnt \ / C \ / /, / \ \ / \ / / g’

替换

C:\Users\San.谭\我的文件夹\ project1

to

mnt / c /用户/圣。棕褐色/我的文件夹/ project1

以防有人需要将windows路径替换为windows子系统for Linux(WSL)路径

其他回答

Tcl有一个内置的功能

$ tclsh
% string map {ab bc bc ab} abbc
bcab

它的工作原理是每次遍历字符串的一个字符,从当前位置开始进行字符串比较。

在perl中:

perl -E '
    sub string_map {
        my ($str, %map) = @_;
        my $i = 0;
        while ($i < length $str) {
          KEYS:
            for my $key (keys %map) {
                if (substr($str, $i, length $key) eq $key) {
                    substr($str, $i, length $key) = $map{$key};
                    $i += length($map{$key}) - 1;
                    last KEYS;
                }
            }
            $i++;
        }
        return $str;
    }
    say string_map("abbc", "ab"=>"bc", "bc"=>"ab");
'
bcab

也许是这样的:

sed 's/ab/~~/g; s/bc/ab/g; s/~~/bc/g'

将~替换为一个您知道不会出现在字符串中的字符。

Sed是一个流编辑器。它贪婪地搜索和替换。实现您所要求的唯一方法是使用中间替换模式,并在最后将其更改回来。

Echo 'abcd' | sed -e /ab/xy/;s/cd/ab/;s/xy/cd/'

我相信这应该能解决你的问题。我可能遗漏了一些边缘情况,如果你注意到一个,请评论。

您需要一种方法将以前的替换从未来的模式中排除,这实际上意味着使输出可区分,并将这些输出从搜索中排除,最终使输出再次不可区分。这与引用/转义过程非常相似,因此我将从中吸取教训。

S /\\/\\\\/g转义所有现有的反斜杠 S /ab/\\b\ c/g用原始ab代替已转义的BC S /bc/\\a\ b/g将原始bc替换为转义的ab s/\\\(.\)/\1/g将所有转义的X替换为原始X

我没有解释ab或bc中的反斜杠,但直觉上,我将以同样的方式转义搜索和替换术语——\ now匹配\\,而被替换的\\将显示为\。

到目前为止,我一直使用反斜杠作为转义字符,但它不一定是最好的选择。几乎任何字符都可以工作,但是要注意环境中需要转义的字符,sed等,这取决于您打算如何使用结果。

如果将字符串替换为Variable,则解决方案将不起作用。 sed命令需要使用双引号,而不是单引号。

#sed -e "s/#replacevarServiceName#/$varServiceName/g" -e "s/#replacevarImageTag#/$varImageTag/g" deployment.yaml