如何为Makefile编写Perl单行程序,以便将文字\ n翻译成换行符?

时间:2010-05-13 14:06:13

标签: regex perl

我需要逃避\ n输出我真的得到换行符或标签

$ perl -p -e 's/e/a/ge'

现在我希望每个e都被\ n

替换
$ perl -p -e 's/e/\n/ge'

但即使\ n也给我一个错误。

这是一个简化的例子。在实际脚本(makefile)中我有

substitute := perl -p -e 's/@([^@]+)@/defined $$ENV{$$1} ? $$ENV{$$1} : $$1/ge'

并且在目标中我有一个很好的命令

$(substitute) $< > $@

如果perl的输入文件在输出中包含\n,我会在字面上看到它......我想要真正的换行符。

4 个答案:

答案 0 :(得分:4)

删除e修饰符,替换工作正常:

perl -p -e 's/e/\n/g' file

来自perldoc perlop

e   Evaluate the right side as an expression.

UPD:如果要保留它,请将转义序列放在双引号中:

perl -p -e 's/e/"\n"/ge' file

答案 1 :(得分:3)

在你的正则表达式中你真的不需要e

dpavlin@llin:~/private/home_html$ perl -p -e 's/e/\n/g'
foedoe
fo
do

答案 2 :(得分:3)

要插入自身需要插值的内容(如变量或转义),请使用双e并添加引号:

perl -p -e 's/@([^@]+)@/q!"! . ( defined $ENV{$1} ? $ENV{$1} : $1 ) . q!"!/gee'

如果替换本身包含未转义的“或$或@,则无效;在这种情况下,您需要单独执行反斜杠转义处理。

答案 3 :(得分:0)

echo xeieio | perl -pe 's/(.)/$k=$1;$k=~s#e#\n#;$k/ge'

输出:

  

X
  我
  我好

它做什么...对于每个角色,将其分配给$ k,在$ k上运行一个简单的s / e / \ n /,然后打印$ k。 (另外,一如既往,有多种方法可以做到这一点)