在 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 单行命令的主要内容,如果未能解决你的问题,请参考以下文章