假设我有'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是一个流编辑器,它的替换是贪婪的,我认为我将需要使用一些脚本语言。
假设我有'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是一个流编辑器,它的替换是贪婪的,我认为我将需要使用一些脚本语言。
当前回答
我相信这应该能解决你的问题。我可能遗漏了一些边缘情况,如果你注意到一个,请评论。
您需要一种方法将以前的替换从未来的模式中排除,这实际上意味着使输出可区分,并将这些输出从搜索中排除,最终使输出再次不可区分。这与引用/转义过程非常相似,因此我将从中吸取教训。
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等,这取决于您打算如何使用结果。
其他回答
也许是这样的:
sed 's/ab/~~/g; s/bc/ab/g; s/~~/bc/g'
将~替换为一个您知道不会出现在字符串中的字符。
下面是ooga答案的一个变体,适用于多个搜索和替换对,而无需检查值如何重用:
sed -i '
s/\bAB\b/________BC________/g
s/\bBC\b/________CD________/g
s/________//g
' path_to_your_files/*.txt
这里有一个例子:
之前:
some text AB some more text "BC" and more text.
后:
some text BC some more text "CD" and more text.
注意\b表示单词边界,这可以防止________干扰搜索(我在Ubuntu上使用GNU sed 4.2.2)。如果不使用单词边界搜索,则此技术可能不起作用。
还要注意,这与删除s/________//g并在命令末尾附加&& sed -i 's/________//g' path_to_your_files/*.txt的结果相同,但不需要两次指定路径。
类似于jthill所建议的,如果知道文件中没有空值,可以使用\x0或_\x0_来代替________。
以下是SED手册的节选:
- e脚本 ——表达=脚本 将脚本中的命令添加到处理输入时要运行的命令集中。
在每个替换前加上-e选项并将它们收集在一起。下面是一个适合我的例子:
sed < ../.env-turret.dist \
-e "s/{{ name }}/turret$TURRETS_COUNT_INIT/g" \
-e "s/{{ account }}/$CFW_ACCOUNT_ID/g" > ./.env.dist
这个例子还展示了如何在替换中使用环境变量。
我相信这应该能解决你的问题。我可能遗漏了一些边缘情况,如果你注意到一个,请评论。
您需要一种方法将以前的替换从未来的模式中排除,这实际上意味着使输出可区分,并将这些输出从搜索中排除,最终使输出再次不可区分。这与引用/转义过程非常相似,因此我将从中吸取教训。
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