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

Posted 程序工匠坊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在 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。独立脚本可以写备忘注释,可以接收额外参数适应不同需求。


以上是关于在 vim 编辑中使用 perl 单行命令的主要内容,如果未能解决你的问题,请参考以下文章

Perl单行(Perl One-Liners)命令

perl单行命令[03]-awk

10 个最酷的 Linux 单行命令

Linux运维必备技能:如何在 Vim 中删除多行?

vim 嵌套单行循环中断命令

Perl one lines