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
文章评论