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
我想在 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