带撇号的 sed 命令

带撇号的 sed 命令
sed -e 's/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/'

我收到以下错误信息:

  sed: -e expression, char 20: unterminated `s' command

请问,我该如何修正 sed 命令?

答案1

$ sed -e "s/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/"

或者

sed -e 's/cluster_name: '\''Test Cluster'\'\/cluster_name:' '\'Test' 'Cluster1\'/

如果没有这个程序的帮助,那么使用单引号的命令会更难构造。如果您需要一些帮助来获取正确的命令,可以使用一个 C 程序

$ cat w.c
#include <stdio.h>

int main(int argc, char *argv[]) {
        int i = 0;
        while (argv[i]) {
                printf("argv[%d] = %s\n", i, argv[i]);
                i++;
        }
        return 0;
}

我是从 cygwin 测试的,但任何 *nix shell 都应该是一样的

你看这个有效

$ ./w sed -e "s/cluster_name: 'Test Cluster'/cluster_name: 'Test Clust
er1'/"
argv[0] = F:\blah\w.exe
argv[1] = sed
argv[2] = -e
argv[3] = s/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/


$

如果你尝试一下 suspectus 的那个

sed -e 's/cluster_name: \'Test Cluster\'/cluster_name: \'Test Cluster1\'/'

你可以使用该程序来查找其中的错误

他的一个甚至没有执行

$ ./w  sed -e 's/cluster_name: \'Test Cluster\'/cluster_name: \'Test C
luster1\'/'
>CTRL-C

因为它缺少单引号

$ ./w'fgg
>

或许还有其他问题。

如果你看看 suspectus 的那个,它甚至在开始的时候就失败了,它在空间上断裂了

$ ./w  sed -e 's/cluster_name: \'Test Clu
argv[0] = f:\blah\w.exe
argv[1] = sed
argv[2] = -e
argv[3] = s/cluster_name: \Test
argv[4] = Clu

这个有效

$ ./w  sed -e 's/cluster_name: '\''Test Cluster'\'\/cluster_name:' '\'
Test' 'Cluster1\'/
argv[0] = F:\blah\w.exe
argv[1] = sed
argv[2] = -e
argv[3] = s/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/

将它们组合在一起后,您可以尝试添加一个空格和一个字符,然后查看您的引号模式是打开还是关闭。如果是关闭的,那么如果您想转义单引号,则使用 \' 如果是打开的,则使用 ' 然后执行 \' 将其关闭 如果您无法跟踪它是打开还是关闭,则添加一个空格,查看它是否会生成新参数。

答案2

您需要转义 seds命令中的单引号:

sed -e 's/cluster_name: '\''Test Cluster'\''/cluster_name: '\''Test Cluster1'\''/'

编辑单引号通常比较棘手。无论字符串中哪里有单引号,'\''我都会尝试解释其工作原理 - 欢迎大家对此进行改进!

'\''- 第一个引号结束 sed 字符串,后面的内容由 shell 解析。反斜杠将后面的字符渲染为简单字符(而不是元字符)。最后一个引号结束 bash 解释部分,后面的内容由 解析sed

相关内容