代码之家  ›  专栏  ›  技术社区  ›  Preet Sangha

SED语法帮助:未终止的“s”命令

  •  2
  • Preet Sangha  · 技术社区  · 15 年前

    编辑:我在Windows Vista上使用Cygwin/GNU SED 4.1.5版,我希望进行不区分大小写的搜索

    我想使用sed替换inline,如下所示:

    C:\dev\suite\anything here---blah 12 334 xxx zzzzz等\模块等

    编辑: 这里的任何东西---blah 12 334 xxx zzz等意味着任何东西都可能出现在这里。不好意思遗漏了。

    在一个文件中

    FileName="c:\DEV\Suite\anything here --- blah 12 334 xxx zzzzz etc\Modules\.... snipped ...."
    

    如果我提供了一个值,那么说:

    项目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 回复  |  直到 9 年前
        1
  •  7
  •   retracile    15 年前

    是'/'前的'\'。显然你需要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
    
        2
  •  1
  •   Jim Lewis    15 年前

    如果我在你有“的地方使用”它对我很有用。对于双反斜杠,其解析方式显然有一个反斜杠,它转义了替换表达式的终止“/”。(如果将“.*”替换为“.+”,仍然会得到错误。)

    (有趣的是,我不得不加上更多的反斜杠才能把这个贴好——所以吃了一些!)

        3
  •  0
  •   Preet Sangha    15 年前

    明白了:替换 * 具有 +

    sed -r -b s/Dev\\Suite\\.+\\Modules/dev\\suite\\simple\\/g test.txt
    
        4
  •  0
  •   brianegge    15 年前

    我不知道你用的是什么版本的SED。我不熟悉-b选项。

    首先,我建议使用 regex标志,使其不区分大小写。您的dev示例与dev的regex不匹配。

    我怀疑您遇到的问题是,您的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\\
    
        5
  •  0
  •   Ryan Fernandes    15 年前

    好。。。

    sed -e s/"anything here --- blah 12 334 xxx zzzzz etc"/"Project X - Version 99.98"/g test.txt
    

    工作精细

    (未终止的“s”的符合性是由于未捕获的“/”)。

        6
  •  0
  •   user2712294    11 年前

    有趣的是,我在一个目录中有相同的问题,但是相同的命令在同一台机器上的其他目录中工作。这是我正在使用的命令

    导出版本= 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”>sonar-project.properties

    当我把*改为+时,它起作用了。

    谢谢:

        7
  •  0
  •   Sid    9 年前

    将重命名:

    电视节目-376[720p].mkv
    电视节目-377[720p].mkv

    37.6MKV
    37.7MKV

    在Cygwin工作。

    #!/bin/bash
    
    for i in *; do
      mv "$i" "`echo $i | sed -r -b 's/^.*[ ]([0-9]*)[ ].*$/\1.mkv/'`";
    done