在 vim 编辑中使用 perl 单行命令

据说 perl 的初衷是 shell 与 sed、awk 的三合一杂交产物。也就是说,shell 还是要

会的,但 sed 与 awk 没必要深入学习了,只要学会 perl (的基础部分)就可以了。

于是,perl 支持非常强大的单行命令。结合超强的可视编辑器 vim 的命令行模式,可以

更方便灵活地处理复杂编辑需求。

## perl 命令行参数

* -e 将 perl 代码放在单引号中,作为 perl -e 选项的参数

* -M 额外加载模块,类似 use 语句

* -n 隐式循环,while() 处理标准输入或文件的每一行

* -p 同 -n 但在循环末尾自动打印 `$_` 当前行变量,-n 要在 -e 代码中显式用 print

* -l 自动在每个 print 输出后加换行 "\n"

* -a 在隐式循环中自动分隔每行,类似 awk 工作模式,-F 指定分隔符

* BEGIN END 在 -e 代码中要加入这两个块,类似 awk 在所有循环前后执行

* -i 原位编辑文件,类似 sed 的原位编辑参数,慎用覆盖原文件

完整参数解释参考手册 $perldoc perlrun

## 典型参数组合示例模板

* perl -pe 'any perl code;' -e 'any perl code too;' input-files

非常类似 sed,读取输入文件的每一行,存入 `$_` 默认变量,修改后打印该行。如果不

接文件参数,就等待从标准输入。可用 > 重定向到输入文件。若加 -i 选项,则原位编

辑输入文件,最好提供备份后缀名,如 -i.bak 备份原文件。

如果不想打印整行,只想提取一部分,请用 -n 选项然后显式调用 print。例如:

perl -lne 'print $1 if /REGEXP/;'

是否要 -l 选项自动添加 "\n" 看需求

* perl -aF: -ne 'code using @F' input-files

非常类似 awk,自动分隔每一行,可用 F 指定分隔符,或用按默认的空白 '\s+' 分隔。

分隔结果保存在 @F 数组中,$F[0] 是第一列,`$_` 是整行。同样支持 BEGIN END 块。

## 在 vim 的命令中使用单行 perl 命令

在 vim 命令行中用 :!perl 调用外部 perl 单行命令,vim 编译版本无需 +perl 支持,

只要 shell 中能执行 perl 解释器即可。

使用 :%!perl -lne 'print perl code' 过滤当前编辑 buff 的所有行。没有给 perl 命

令提供文件参数,表示从标准输入,而 vim 会将当前编辑文本按标准输入发给 perl 命

令,其输出替换当前编辑文本。

使用 :' !perl -lne 'print perl code' 过滤当前选定的部分文本行。' 是在

可视模式下按 : 自动加上的特殊行地址,也可以手动输入数字表示起止行,% 表示所有

行,. 表示当前行,$ 表示最后一行。

在 vim 中尝试使用 perl 单行命令,有个好处是如果 perl 代码写错了(如正则表达式

失误),可按 u 一键撤销修改。

对于复杂的 perl 代码或 perl 新手,不方便使用单行命令时,建议写成独立 perl 脚本

,在脚本中显式使用 while() {} 循环。然后在 vim 中使用过滤命令 :%!perl

script.pl。独立脚本可以写备忘注释,可以接收额外参数适应不同需求。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180408G1IIHS00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励