Sed匹配不需要的额外字符

时间:2018-03-22 14:36:56

标签: regex sed cygwin

我想在Cygwin中使用sed替换配置文件中的部分文件路径。文件路径的格式为\\\\some\\constant\\path\\2018-03-20_2030.1\\Release\\base\\some_dll.dll(是的,文件中有双反斜杠),应替换包含日期的开头部分。

为了匹配,我写了以下正则表达式:\\\\\\\\some\\\\constant\\\\path\\\\[0-9_\.-]*,字符集应该匹配日期,由数字和“ - ”,“_”和“。”组成。符号。这导致以下命令替换:sed 's/\\\\\\\\some\\\\constant\\\\path\\\\[0-9_\.-]*/bla/g' file.txt

问题是,在替换后,我使用blaRelease\\base\\some_dll.dll而不是bla\\Release\\base\\some_dll.dll,因为使用Regexr成功替换了它。

为什么sed会以这种方式运行,我该如何解决?

2 个答案:

答案 0 :(得分:0)

一个简单的sed可以帮助你。

sed 's/.*Release/bla\\\\Release/'    Input_file

如果您想备份Input_file并将其输出保存到Input_file本身,那么以下内容可以帮助您。

sed  -i.bak 's/.*Release/bla\\\\Release/'  Input_file

在另一种情况下,如果你只是想将输出保存到Input_file本身,那么下面也可以帮助你。(上面和这之间的区别是这个不会创建原始Input_file的备份)。

sed -i 's/.*Release/bla\\\\Release/'   Input_file

答案 1 :(得分:0)

问题是字符类[0-9_\.-]匹配反斜杠。如果您使用[0-9_.-]替换该类,它将按预期执行。

请注意,在字符类中,.并不特殊,不需要引用。例如,从我的Cygwin命令行:

$ echo '\.' | sed 's/[\.]/x/g'
xx
$ echo '\.' | sed 's/[.]/x/g'
\x