Perl换行替换

时间:2013-10-27 15:19:13

标签: perl newline

使用下面的例子,我试图用“|”替换“\ n \ nbeer / name:”字符:

beer/name: The Horseman's Ale
beer/beerId: 33061
beer/brewerId: 14359
beer/ABV: 5.20

beer/name: blah beer
beer/beerId: 33045
beer/brewerId: 14678
beer/ABV: 5.98

...

我正在使用以下内容尝试执行此操作,但它正在删除整个文件。

perl -pi -0 -w -e "s,\nbeer/name,|,g" file.txt

这是我得到的错误:

Substitution loop at -e line 1, <> chunk 1.

如何修改此代码才能生效?

2 个答案:

答案 0 :(得分:1)

我不确定是否理解你的需要,但是

我用这种方式对此进行了测试:

perl -0pwe "s,\nbeer/name,|,g" <<<"beer/name: The Horseman's Ale"$'\nbeer/beerId: 33061\nbeer/brewerId: 14359\nbeer/ABV: 5.20\n\nbeer/name: blah beer\nbeer/beerId: 33045\nbeer/brewerId: 14678'

在命令行上。

输出:

beer/name: The Horseman's Ale
beer/beerId: 33061
beer/brewerId: 14359
beer/ABV: 5.20
|: blah beer
beer/beerId: 33045
beer/brewerId: 14678

cat替换perl部分确保测试流程:

cat <<<"beer/name: The Horseman's Ale"$'\nbeer/beerId: 33061\nbeer/brewerId: 14359\nbeer/ABV: 5.20\n\nbeer/name: blah beer\nbeer/beerId: 33045\nbeer/brewerId: 14678' | sed 's/^/    /'

输出:

beer/name: The Horseman's Ale
beer/beerId: 33061
beer/brewerId: 14359
beer/ABV: 5.20

beer/name: blah beer
beer/beerId: 33045
beer/brewerId: 14678

所以从那里我可以轻松地点击 Ctrl + A 并使用 left Ctrl + 和/或 Ctrl + 到达位置修改你的行...

一旦您的输出符合您的需要,您可以简单地更换您的开关:

perl -0pwe '...' -i.bak path/filename

或者构建一个perl脚本:

perltidy <<< 's,\nbeer/name,|,g'

sed '1i#!/usr/local/bin/perl -0pwi.bak\nuse strict;' <(
    perltidy <<< 's,\nbeer/name,|,g') >myscript.pl

答案 1 :(得分:0)

这不会回答您的问题,但有助于保留工作文件。

要防止文件被“删除/清除”,您可以为-i开关添加备份后缀。这将使用给定的扩展名保存原始文件。

来自perlrun

  

<强> -i [延伸]

     

指定由&lt;&gt;处理的文件构造将被就地编辑。它通过重命名输入文件,按原始名称打开输出文件,并选择该输出文件作为print()语句的默认值来完成此操作。扩展(如果提供)用于修改旧文件的名称以制作备份副本,遵循以下规则:   ...