【问题标题】:Sed block garbled on tcsh. Works in bashSed 块在 tcsh 上出现乱码。在 bash 中工作
【发布时间】:2015-09-28 19:48:11
【问题描述】:

我有一个有效的 sed 命令可以替换 ma​​tched 块中的一些坐标,如下所示: sed 命令看起来像这样并且在 bash 中工作:

sed '/^matched.*$/ {
n;n;n;s/img{[0-9]*,[0-9]*}/img{0,10}/;n;s/img{[0-9]*,[0-9]*}/img{20,30}/;n;s/img{[0-9]*,[0-9]*}/img{40,0}/ 
}
' file.txt

它搜索匹配并在 next 行中执行一些 s替换
问题在于,与 bash 相反,如果我键入第一行代码并在 tcsh 中按 Enter。代码立即执行并返回缺少的 '. 如果我使用 tcsh 执行相同的命令并删除所有换行符,那么我会得到 sed: command garbled: (在 ubuntu 上使用 bash sed 4.2.2 版,它甚至可以在没有换行符的情况下工作)

我知道问题与包含 sed 代码块的花括号 { } 前后的新行有关。但我不知道如何在那里输入它们。
另外,我不知道如何将这些换行符放在 shell 脚本中,以便在它们的单独行上放置大括号。

file.txt:

unmatched
                                           {
                                             "img{170,68}"
                                             "img{817,252}"
                                             "img{664,1096}"
                                             "img{12,943}"
                                           }

matched
                                           {
                                             "img{0,0}"
                                             "img{0,111}"
                                             "img{222,333}"
                                             "img{444,0}"
                                           }

【问题讨论】:

    标签: bash shell sed tcsh


    【解决方案1】:

    tcshcsh 的语法继承者,因此,要求'...single-quotes...'"...dbl-quotes..." 内的任何虚线都用\ 字符转义。

    所以你想要

    sed '/^matched.*$/ { \
    n;n;n;s/img{[0-9]*,[0-9]*}/img{0,10}/;n;s/img{[0-9]*,[0-9]*}/img{20,30}/;n;s/img{[0-9]*,[0-9]*}/img{40,0}/ \
    } \
    ' file.txt
    

    还要注意\ 字符必须是该行的最后一个字符;后面的任何空白字符都会产生同样神秘的错误消息:-)

    (我现在没有可用的 `[t]csh' 环境,所以我不能像往常一样测试这个答案。)

    IHTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 2016-06-15
      • 2010-09-07
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多