刘荣星的博客

  • 留言
  • About
一个关注Linux/BSD运维等相关知识的博客
  1. 首页
  2. Perl
  3. 正文

Perl健忘录

2012-11-29 13317点热度 0人点赞 0条评论

perl -lne 的作用
-l: line-ending handling Automatically adds or removes '\n' (处理行结束符,自动加上 \n 换行或者删除 \n 换行)

In effect(作用效果):
chomp()s everything on input 自动 chomp 输入分隔号
A godsend for one-liners

perl    [ -sTtuUWX ]
[ -hv ] [ -V[:configvar] ]
[ -cw ] [ -d[t][:debugger] ] [ -D[number/list] ]
[ -pna ] [ -Fpattern ] [ -l[octal] ] [ -0[octal/hexadecimal] ]
[ -Idir ] [ -m[-]module ] [ -M[-]'module...' ] [ -f ]
[ -C [number/list] ]
[ -P ]
[ -S ]
[ -x[dir] ]
[ -i[extension] ]
[ [-e|-E] 'command' ] [ -- ] [ programfile ] [ argument ]...

-n
代表遍历文件的内容,使 Perl 隐式地循环遍历指定的文件,并只打印规定的行。

-e
代表执行 perl 命令,一般 -e 后面接 'command' 要执行的命令了,参数的顺序有时候也要注意的,我现在认为 -e 一般紧接着要执行的命令,所以 -e 作为最后一个参数放在那里。

-p
使 Perl 隐式地循环遍历指定的文件,同时打印所有的行。

-P
使要运行的脚本在 Perl 编译之前通过 C 预处理程序。

请注意:-p 开关和 -n 开关的使用。当您想显式打印数据时,使用 -n 开关。-p 开关隐式地将 print $_ 语句插入到 -n 开关所产生的循环中。因此,-p 开关更适用于对文件进行的完全处理,而 -n 开关更适用于选择性文件处理,这样的处理只需打印特定数据。

我现在喜欢使用 -l 参数,用来给每一个输出加 \n. 例如

$ perl -le 'print "Hello World!"'

常用的 Perl 单行实例

perl -pi -e's/aaa/bbb/' filename
修改当前 file 文件中的文件,不生成中间文件,速度很快.记住 -i 开关,因为它让你原地编辑文件。

perl -ne 'print if /^int/' filename
象 grep 一样过滤文件中需要的内容。这个地方,使用了 -n,所以一次是做一行的操作,直到整个文件读完。另外,在管道时,-n 也会一样,来遍历管道送过来的内容。

perl -n -e 'print "$. - $_"' filename
这个例子中的,没用 -ne,只是命令写成了 -n -e,其实一样,这个例子中,是给当前文件中的内容都加一个行号打印出来.注:$.表示当前行号。

perl -pe '$_ = "$. $_"' filename
这个其实和上面一样,分别只是使用了 -p 替换了 -n,这个有个什么好处啦,别的地方都一样,但 -p 按行来遍历完文件后,会给 $_ 打印出来。大家还记得 awk 分割域(awk‘{i = NF – 1; print $1 + $i}’),是不是很方便,下面我们来看看 perl

perl -lane 'print $F[0] + $F[-2]'
这个神奇的地方在于 -a,使用 -a 后.因为 -n 分行读进来,然后 -a 给数据分割成 @F 的数组。

perl -ne 'print if /^START$/ .. /^END$/'
打印正则中从 $start 到 $end 的地方

perl -ne 'print if $. >= 15; exit if $. >= 17;'
有效地打印数字范围中的行

perl -p -i.bak -e 's/\bfoo\b/bar/g' *.c
原地修改 -i 开关的神奇之处在于它对 @ARGV 中的每个文件都用该脚本对该文件输出所产生的文件版本进行替代。

perl -ne 'print scalar reverse $_' test
给文件中的内容反向排序,比如文件中有 fukai,就会变成 iakuf.

替换

将所有 C 程序中的 foo 替换成 bar,旧文件备份成 .bak
perl -p -i.bak -e 's/\bfoo\b/bar/g' *.c

很强大的功能,特别是在大程序中做重构。记得只有在 UltraEdit 用过。如果你不想备份,就直接写成 perl -p -i -e 或者更简单 perl -pie

将每个文件中出现的数值都加一
perl -i.bak -pe 's/(\d+)/ 1 + $1 /ge' file1 file2 ....

将换行符 \r\n 替换成 \n
perl -p -i -e 's/\r\n/\n/g' file
同 dos2unix 命令。

将换行符 \n 替换成 \r\n
perl -pie 's/\n/\r\n/g' file
同 unix2dos 命令。

取出文件的一部分
显示字段 0-4 和字段 6,字段的分隔符是空格
perl -lane 'print "@F[0..4] $F[6]"' file
同 awk 'print $1, $2, $3, $4, $5, $7'。参数名称 lane 也很好记。

如果字段分隔符不是空格而是冒号,则用
perl -F: -lane 'print "@F[0..4]\n"' /etc/passwd

显示

显示 START 和 END 之间的部分
perl -ne 'print if /^START$/ .. /^END$/' file

相反,不显示 START 和 END 之间的部分
perl -ne 'print unless /^START$/ .. /^END$/' file

显示开头 50 行:
perl -pe 'exit if $. > 50' file
同命令 head -n 50

不显示开头 10 行:
perl -ne 'print unless 1 .. 10' file

显示 15 行到 17 行:
perl -ne 'print if 15 .. 17' file

每行取前 80 个字符:
perl -lne 'print substr($_, 0, 80) = ""' file

每行丢弃前 10 个字符:
perl -lne 'print substr($_, 10) = ""' file

搜索

查找 comment 字符串:
perl -ne 'print if /comment/' duptext
这个就是普通的 grep 命令了。

查找不含 comment 字符串的行:
perl -ne 'print unless /comment/' duptext
反向的 grep,即 grep -v。

查找包含 comment 或 apple 的行:
perl -ne 'print if /comment/ || /apple/' duptext
相同的功能就要用到 egrep 了,语法比较复杂……

计算
计算字段 4 和倒数第二字段之和:
perl -lane 'print $F[4] + $F[-2]'
要是用 awk,就得写成 awk '{i=NF-1;print $5+$i}'

排序和反转
文件按行排序:
perl -e 'print sort ' file
相当于简单的 sort 命令。

文件按段落排序:
perl -00 -e 'print sort ' file

多个文件按文件内容排序,并返回合并后的文件:
perl -0777 -e 'print sort ' file1 file2

文件按行反转:
perl -e 'print reverse ' file1

相应的命令有吗?有,tac( cat 的反转)

<strong>数值计算</strong>

[shell]10 进制转 16 进制:
perl -ne 'printf "%x\n",$_'

10 进制转 8 进制:
perl -ne 'printf "%o\n",$_'

16 进制转 10 进制:
perl -ne 'print hex($_)."\n"'

8 进制转 10 进制:
perl -ne 'print oct($_)."\n"'

简易计算器。
perl -ne 'print eval($_)."\n"'

其他

启动交互式perl:
perl -de 1

查看包含路径的内容:
perl -le 'print for @INC'

备注
与 One-Liner 相关的 Perl 命令行参数:
-0
(用 8 进制表示)指定记录分隔符( $/ 变量),默认为换行
-00
段落模式,即以连续换行为分隔符
-0777
禁用分隔符,即将整个文件作为一个记录
-a
自动分隔模式,用空格分隔 $_ 并保存到 @F 中。相当于 @F = split ''。分隔符可以使用 -F 参数指定

-F
指定 -a 的分隔符,可以使用正则表达式

-e
执行指定的脚本。

-i
原地替换文件,并将旧文件用指定的扩展名备份,不指定扩展名则不备份

-l
对输入内容自动 chomp,对输出内容自动添加换行

-n
自动循环,相当于 while() { 脚本; }

-p
自动循环 + 自动输出,相当于 while() { 脚本; print; }

A Field Guide To The Perl Command Line PDF
command-line-options

http://perl101.org/command-line-switches.html

标签: Perl
最后更新:2016-12-06

JavasBoy

这个人很懒,什么都没留下

点赞
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

最新 热点 随机
最新 热点 随机
CentOS7 python2 安装 elasticsearch 模块 在VMWare Workstation虚拟机里使用 yubikey Gentoo Gnome 登陆界面开启触摸板轻击 python3去除emoji表情符号 记录几个内网广播包 Linux Mint 20 gnome-terminal 使用等距更纱黑体 SC字体
青岛之行 得,进了3ds max影视包装长期班 今天更换主题为Prower V2 Linux下utf-8 BOM 文件的检查与删除 UBUNTU 8.04 3D特效桌面演示 Linux 7条致命命令
分类
  • After Effects / 20篇
  • Apple / 5篇
  • Archlinux / 4篇
  • Bash / 2篇
  • Cinema 4D / 1篇
  • Docker / 1篇
  • eMule / 2篇
  • FreeBSD / 9篇
  • Gentoo / 1篇
  • Go / 2篇
  • gpg / 1篇
  • Graphics / 15篇
  • Haproxy / 1篇
  • ingress / 1篇
  • IntelliJ_IDEA / 1篇
  • java / 2篇
  • kafka / 1篇
  • Linux / 24篇
  • MySQL / 3篇
  • network / 3篇
  • Network / 4篇
  • Nginx / 5篇
  • Perl / 4篇
  • Python / 9篇
  • Python 操作符 / 1篇
  • Python 正则 / 2篇
  • rose / 1篇
  • Script / 4篇
  • Tornado / 1篇
  • Vim / 5篇
  • 学习 / 24篇
  • 电脑 / 29篇
  • 那不勒斯 / 1篇
  • 随笔 / 45篇
标签聚合
双系统 Linux MAC Graphics After Effects AE FreeBSD python

COPYRIGHT © 2025 刘荣星的博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang