用特定条件替换Bash中的字符串

时间:2019-01-10 00:05:40

标签: string bash replace

如果我有字符串:

path1=/path/me & you/file.json&path2=/path/you & me/file.txt

我希望输出如下:

path1=/path/me & you/file.json;path2=/path/you & me/file.txt

我需要替换&,因为它的前后均不包含space,我尝试使用sed,但我一直得到这个

path1=/path/me ; you/file.json;path2=/path/you ; me/file.txt

3 个答案:

答案 0 :(得分:1)

您可以使用[^ ]来匹配非空格字符,并确保其位于\(capture group\)中,以便可以在替换字符串中引用它:

sed -e 's/\([^ ]\)&\([^ ]\)/\1;\2/'

这会找到non-space & non-space的任意三个字符序列,并将其替换为两个捕获的字符,从而有效地替换了任何&,且其旁边没有空格。 / p>

这将影响foo&bar,但不会影响foo & barfoo& bar&foo

答案 1 :(得分:0)

sed -r 's/(\S)&(\S)/\1;\2/g'

-r启用正则表达式,而\ S则是空格除外。

答案 2 :(得分:0)

我猜也许你在找

sed 's/&\([a-z][a-z0-9]*=\)/;\1/g'

即仅替换分号,其后紧跟一个标记和一个等号。 (您可能必须根据令牌的外观来调整令牌的定义。例如,通常支持下划线,但很少使用下划线。您也希望支持大写。)

如果可能的话,请修复产生这些值的过程,因为格式本质上是模棱两可的。