在 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