在perl中的bash中逃脱

时间:2016-05-31 02:23:40

标签: bash perl escaping

我在perl中运行一些东西,并使用以下命令删除连续的重复行(仅保留其中一行)

system("sed -i '$!N; /^\(.*\)\n\1$/!p; d' *[13579].csv");

但是,当我运行它时,我收到以下错误:

sed: -e expression #1, char 11: unterminated address regex

我有一种感觉它与我的逃避有关,但我不太确定,因为我对perl和bash缺乏经验。我知道美元符号应该被逃脱,但反斜杠呢?有没有人有一个很好的资源,他们可以指点我去了解更多关于在perl中逃避bash的事情?谢谢!

1 个答案:

答案 0 :(得分:1)

将sed放入Perl时可能很挑剔,你可以做几件事。第一个是改变你在命令系统运行和sed模式周围的引号类型(翻转外部到单个,内部到双重);另一个选择是转义sed中的\个字符。

system('sed -i "$!N;/^\(.*\)\n\1$/!p;d" *filename');

注意:由于您的文件名使用特殊字符,因此可能需要转义才能使用globbing(例如。*\\[13579].csv);逃避将是这样的:

system("sed -i '$!N;/^\\(.*\\)\\n\\1\$/!p;d' *\\[13579].csv");

如果你的文件名恰好包含空格,那么那些也需要转义。

system("sed -i '$!N;/^\\(.*\\)\\n\\1\$/!p;d' *\\[12345]\\ \\[13579].csv");
然后

sed会找到与*[12345] [13579].csv匹配的任何文件并就地编辑它们。