1

使用下面的示例,我试图用“|”替换“\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.

如何修改此代码以使其正常工作?

4

2 回答 2

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

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

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

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
于 2013-10-27T16:58:17.090 回答
0

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

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

perlrun

-i[扩展名]

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

于 2013-10-27T16:16:51.487 回答