查看原文
其他

Perl学习06之一行式操作

pythonic生物人 pythonic生物人 2022-09-11

"pythonic生物人"的第11篇分享



摘要

Perl一行式使用

目录

1、一行式选项

2、特殊字符

3、一行式使用实例

例1:每一行后面加空行
例2:每一行后加空行,空行除外
例3:连续输出多个相等字符
例4:行前加空行
例5:输出非空行
例6:移除单词间所有空白
例7:每行单词间连续空白压缩为单空格
例8:原地修改拷贝
例9:所有行行号
例10:非空行行号递增,全部输出
例11:非空行行号递增,只输出非空行
例12:#计数单词个数,为每个单词编号
例13:#计算每行单词个数,每行单独编号

4、参考文献

正文开始啦



Perl程序一行命令,可以替代grep+sed+awk;

1、一行式选项
-e 表示后面接perl的一行式表达式;
-p 表示print操作,即对每一读入的行在经过表达式操作后都默认输出;
-n 表示处理文件但默认不输出处理后的行;
-p -n都存在 -n和-p两个选项会自动读取文件,-p会覆盖-n;
-l 在结合-n或-p使用的时,会自动对读入的行移除尾随换行符,然后在输出的时候自动追加尾随输出分隔符;
-i 原地修改、拷贝副本,类似sed的"-i";


2、特殊字符

$\ 输出行分隔符,类似awk的ORS,它默认为undef;
$.    当前处理行的行号。
...........


3、一行式使用实例


例如,待处理文件夹file.log
root x 0 0 root /root /bin/bash
daemon x 1 1 daemon /usr/sbin /usr/sbin/nologinbin x 2 2 bin /bin /usr/sbin/nologinsys x 3 3 sys /dev /usr/sbin/nologinsync x 4 65534 sync /bin /bin/sync


  • 例1:每一行后面加空行

perl -pe '$\="\n"' file.log

#将$\(输出行分隔符)替换为\n,类似awk的ORS,$\默认为空值undef


  • 例2:每一行后加空行,空行除外

perl -pe '$\="\n" unless /^$/' file.log

#unless /^$/跳过空行

perl -pe '$\="\n" if /\s/' file.log

#\s匹配到多个空白符跳过

以上方法类似


  • 例3:连续输出多个相等字符

perl -e 'print "Comeon!\t"x10,"\n";'

#x,表示重复


  • 例4:行前加空行

perl -pe 's/^/\n/g' file.log

#^替换为\n


  • 例5:输出非空行

perl -ne 'print if /\S/' file.log

#匹配到一个空白(\S)就不输出(-n)

perl -ne 'print unless/^$/' file.log

#unless/^$/,匹配到空白就不输出(-n)

perl -lne 'print if length' file.log

#ength($_)为零不输出


  • 例6:移除单词间所有空白

perl -lpe 's/ //g' file.log

#类似于sed -i


  • 例7:每行单词间连续空白压缩为单空格

perl -lpe 's/\s+/ /g' file.log

#s/\s+/ /g 多空白替换为一空白


  • 例8:原地修改拷贝

perl -i".bak" -lpe 's/$/\n/g' file.log

#-i修改文件并复制为file.log.bak


  • 例9:所有行行号

perl -pe '$_ = "$. $_"' file.log

#$.为当前行号


  • 例10:非空行行号递增,全部输出

perl -pe '$_ = ++$x." $_" if /\S/' file.log

#if /\S/ 匹配到非空白行,行号自增并返回(++$x.,$x.中x可以替换为其它字母)


  • 例11:非空行行号递增,只输出非空行

perl -ne 'print ++$x." $_" if /\S/' file.log

#不输出没处理的行,即空白行不输出


  • 例12:#计数单词个数,为每个单词编号

perl -pe 's/(\w+)/"<".++$num.">.$1"/ge' file.log

<1>.root <2>.x <3>.0 <4>.0 <5>.root /<6>.root /<7>.bin/<8>.bash

<9>.daemon <10>.x <11>.1 <12>.1 <13>.daemon /<14>.usr/<15>.sbin /<16>.usr/<17>.sbin/<18>.nologin
<19>.bin <20>.x <21>.2 <22>.2 <23>.bin /<24>.bin /<25>.usr/<26>.sbin/<27>.nologin
<28>.sys <29>.x <30>.3 <31>.3 <32>.sys /<33>.dev /<34>.usr/<35>.sbin/<36>.nologin
<37>.sync <38>.x <39>.4 <40>.65534 <41>.sync /<42>.bin /<43>.bin/<44>.sync

  • 例13:#计算每行单词个数,每行单独编号

perl -pe '$num=0;s/(\w+)/"<".++$num.">.$1"/ge' file.log

<1>.root <2>.x <3>.0 <4>.0 <5>.root /<6>.root /<7>.bin/<8>.bash

<1>.daemon <2>.x <3>.1 <4>.1 <5>.daemon /<6>.usr/<7>.sbin /<8>.usr/<9>.sbin/<10>.nologin
<1>.bin <2>.x <3>.2 <4>.2 <5>.bin /<6>.bin /<7>.usr/<8>.sbin/<9>.nologin
<1>.sys <2>.x <3>.3 <4>.3 <5>.sys /<6>.dev /<7>.usr/<8>.sbin/<9>.nologin
<1>.sync <2>.x <3>.4 <4>.65534 <5>.sync /<6>.bin /<7>.bin/<8>.sync

要想学习更多,参考后面连接,感觉AWK  sed 比这个perl一行亲民太多,不想在浪费时间学这个perl一行了。



4、参考文献
https://www.cnblogs.com/f-ck-need-u/p/10219742.html#直接修改文件
同系列文章

Perl学习01之标量数据
Perl学习02数组和哈希使用
Perl学习03之流程控制结构
Perl学习04之IO及文件读写
Perl学习05之正则表达式


持续更新,欢迎您"关注"、"在看"、"分享"


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存