Sed 匹配不需要的额外字符

Sed matches unwanted extra characters

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

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

问题是,替换后,我得到的是 blaRelease\base\some_dll.dll 而不是 bla\Release\base\some_dll.dll,因为它已使用 Regexr.

成功替换

为什么 sed 会这样,我该如何解决?

一个简单的 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

问题是字符 class [0-9_\.-] 匹配反斜杠。如果您将 class 替换为 [0-9_.-],它将执行您期望的操作。

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

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