执行Sed命令

3
当我运行以下命令时:
sed -e "s/$1/@root@The-Three-Little-Pigs-Siri-Proxy/" -i gen_certs.sh

我得到了以下错误。我正在尝试替换同一文件中的文本$1为下面的文本,而不是创建一个新文件,只是修改当前文件。
sed: -e expression #1, char 0: no previous regular expression

有什么想法是什么原因导致了这个错误,如何修复它?

操作系统:Ubuntu 10.10 32位


“-i” 指定了原地编辑的后缀。 - user647772
1
尝试转义美元符号:$1 - Alex
2个回答

3

$1会在双引号字符串中扩展为空字符串('')。
您可以使用单引号来保留$1的字面值:

sed -e 's/$1/@root@The-Three-Little-Pigs-Siri-Proxy/' -i gen_certs.sh

总体来说这个可行,谢谢。虽然它将其替换为@root@The-Three-Little-Pigs-Siri-Proxy,但我以为@应该是/的替代符。 - awmusic12635
@awmusic12635,不,@不会神奇地变成/。但是你可以为s///命令使用不同的分隔符:sed -e 's!$1!/root/The...!' -i gen_certs.sh - glenn jackman

1

您需要转义模式:sed -e "s/\$1/@root@The-Three-Little-Pigs-Siri-Proxy/" -i gen_certs.sh,因为$1在sed中表示反向引用(假设您想要替换输入中的字符串$1,对吗?)


是的,我想替换字符串$1,因为我没有将其用作变量。 - awmusic12635
我认为你可能将perl和sed混淆了。在sed中,\1表示反向引用。如果它是一个反向引用,它需要先通过分组(例如\(.\))进行定义。由于sed命令是双引号的,因此shell解释$1并返回空值,因此sed看到的是//,即一个空正则表达式。除非有先前的正则表达式,否则这将失败。 - potong
@potong 你说得对!当然,那是一个 shell 扩展。我弄混了,抱歉。 - Alexander Pavlov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接