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
。