编辑:我在Windows Vista上使用CYGWIN / GNU sed版本4.1.5,我想要一个不区分大小写的搜索
我想使用sed替换内联,以下内容:
c:\ DEV \ Suite \ any here --- blah 12 334 xxx zzzzz etc \ Modules etc
编辑这里的任何内容--- blah 12 334 xxx zzzzz etc意味着任何东西都可能出现在这里。很抱歉没有这个。
在包含
等行的文件中FileName="c:\DEV\Suite\anything here --- blah 12 334 xxx zzzzz etc\Modules\.... snipped ...."
带有我提供的价值,比如说:
Project X - 版本99.98
因此文件以:
结束FileName="c:\DEV\Suite\Project X - Version 99.98\Modules\.... snipped ...."
我的尝试:
c:\temp>sed -r -b s/Dev\\Suite\\.*\\Modules/dev\\suite\\simple\\/g test.txt
但是我收到以下错误:
sed: -e expression #1, char 42: unterminated `s' command
感谢。 编辑: 我已经尝试过添加引号。
答案 0 :(得分:7)
这是'/'之前的'\\'。显然你需要4个反斜杠。
sed -r -b "s/Dev\\\\Suite\\\\.*\\\\Modules/dev\\\\suite\\\\simple\\\\/g" test.txt
我认为shell在将'\''解释为'\'之前将其传递给sed,然后sed在它得到的内容上做同样的事情。
单引号可行,所以:
sed -r -b 's/Dev\\Suite\\.*\\Modules/dev\\suite\\simple\\/g' test.txt
答案 1 :(得分:1)
如果我使用“\\\”,你有“\\”,它对我有用。使用双反斜杠,它被解析的方式显然有一个反斜杠转义替换表达式的终止“/”。 (如果我用“。+”替换“。*”,我仍然会收到错误。)
(有趣的是,我不得不添加更多的反斜杠以使其正确发布 - 所以要吃掉其中一些!)
答案 2 :(得分:0)
知道了:用替换。* 。+
sed -r -b s/Dev\\Suite\\.+\\Modules/dev\\suite\\simple\\/g test.txt
答案 3 :(得分:0)
我不知道你使用的是什么版本的sed。我不熟悉-b选项。
首先,我建议使用 i 正则表达式标志,使其不区分大小写。您的DEV示例与Dev的正则表达式不匹配。
我怀疑你遇到的问题是你的sed版本如何解释反斜杠字符。
我建议使用与Cygwin捆绑的sed。使用单引号,它似乎对我有用。
echo 'c:\DEV\Suite\anything here --- blah 12 334 xxx zzzzz etc\Modules\' | sed -r 's/Dev\\Suite\\.*\\Modules/dev\\suite\\simple\\/gi'
c:\dev\suite\simple\\
答案 4 :(得分:0)
以及...
sed -e s/"anything here --- blah 12 334 xxx zzzzz etc"/"Project X - Version 99.98"/g test.txt
工作正常
(关于未终止's'的合规是因为未转义的'/')
答案 5 :(得分:0)
很有趣我在一个目录中遇到了同样的问题,但同一个命令在同一台机器上的其他目录中工作。这是我正在使用的命令
export version = grep "version.*SNAPSHOT.*version" pom.xml |sed -e 's|<version>||g'|sed -e 's|</version>||g'|sed -e "s|\t* *||g"
; cat sonar-project.properties.template | sed -e“s / BUILDVERSION / $ version / g”&gt; sonar-project.properties
当我将*更改为+时,它起作用了。
谢谢:-)
答案 6 :(得分:0)
将重命名:
电视节目 - 376 [720p] .mkv
电视节目 - 377 [720p] .mkv
到
376.mkv
377.mkv
在cygwin下工作。
#!/bin/bash
for i in *; do
mv "$i" "`echo $i | sed -r -b 's/^.*[ ]([0-9]*)[ ].*$/\1.mkv/'`";
done