使用sed将Windows路径替换为数字

时间:2017-05-03 15:37:55

标签: windows bash shell sed

我在Windows上使用Git Bash shell,并尝试使用sed在XML文件中替换这样的字符串:

<customTag>C:\path\to\2016a.0</customTag>

到这样的字符串:

<customTag>C:\path\to\2017b.0</customTag>

我可以像这样直接进行替换:

$ cat test.txt
<customTag>C:\path\to\2016a.0</customTag>

$ sed -i 's^<customTag>C:\\path\\to\\2016a.0</customTag>^<customTag>C:\\path\\to\\2017b.0</customTag>^g' test.txt

$ cat test.txt
<customTag>C:\path\to\2017b.0</customTag>

但是如果我需要为这些字符串传递变量,那么替换不起作用。

$ cat test.txt
<customTag>C:\path\to\2016a.0</customTag>

$ export OLD_VER=2016a.0
$ export NEW_VER=2017b.0

$ sed -i 's^<customTag>C:\\path\\to\\${OLD_VER}</customTag>^<customTag>C:\\path\\to\\${NEW_VER}</customTag>^g' test.txt

$ cat test.txt
<customTag>C:\path\to\2016a.0</customTag>

或者如果我在sed表达式周围使用双引号,我得到&#34;无效的后引用&#34;,大概是因为它认为一年中的2是参考。

$ sed -i "s^<customTag>C:\\path\\to\\${OLD_VER}</customTag>^<customTag>C:\\path\\to\\${NEW_VER}</customTag>^g" test.txt
sed: -e expression #1, char 87: Invalid back reference

逃避或引用此问题的正确方法是什么,或者我最好使用像awk这样的东西?

1 个答案:

答案 0 :(得分:2)

将单引号保留在末尾,并在每个变量周围添加单引号。单引号可防止shell折叠双反斜杠。额外的单引号将变量refs留在引号之外。

或者(不要笑)考虑使用正斜杠。 Windows将两种斜杠识别为路径分隔符;它只是没有的DOS命令shell。