使用下面的例子,我试图用“|”替换“\ 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.
如何修改此代码才能生效?
答案 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()语句的默认值来完成此操作。扩展(如果提供)用于修改旧文件的名称以制作备份副本,遵循以下规则: ...