我想在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会以这种方式运行,我该如何解决?
答案 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