帮助SED语法:unterminated`s'命令

时间:2009-08-13 02:55:42

标签: regex sed cygwin

编辑:我在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

感谢。 编辑: 我已经尝试过添加引号。

7 个答案:

答案 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