搜索和替换不尊重我的“$1”令牌

搜索和替换不尊重我的“$1”令牌

在 Ubuntu 14.04 上使用 bash shell。尝试对文件的每一行进行简单的搜索和替换。我努力了

perl -pi -e "s/.*/DELETE FROM my_object_times where ID = '$1';/g" ids.csv

但这给我留下了一个充满的文件

DELETE FROM my_object_times where ID = '';

我想要捕捉的所有内容根本没有插入。进行此搜索和替换的更好方法是什么?我预计最终结果会是这样的

DELETE FROM my_object_times where ID = 'abcdef12341234abcdef';

答案1

perl -pi -e "s/.*/DELETE FROM my_object_times where ID = '$1';/g" ids.csv

由于 Perl 代码片段位于双引号中,因此 shell 将扩展$1到其当前值(在您的情况下可能为空或未设置)。您需要转义美元符号来防止这种情况发生。此外,您在运算符的模式中没有捕获组s///,因此$1不会包含任何内容。 (perl -w或者use warnings会警告你这一点。)

向模式添加括号,或使用$&.另外,全局替换似乎不适用于零宽度的模式,因此我建议删除g- 标志。

所以:

perl -w -pe "s/.*/DELETE FROM my_object_times where ID = '\$&';/" 

(虽然&不是 shell 中的有效变量,所以$&将保持原样。但一般来说,需要$转义。)

通常,将 Perl 代码放在单引号中会更好,因为美元符号在 Perl 中很常见。但这里 Perl 代码中的单引号让这有点困难。一种选择是将它们以十六进制表示:

perl -w -pe 's/.*/DELETE FROM my_object_times where ID = \x27$&\x27;/' 

答案2

这将做到这一点:

sed -i "s/.*/DELETE FROM my_object_times where ID = '&';/" ids.csv

相关内容