Linux上文本处理工具虽不少,像cut,tr,join,split,paste,sort,uniq,sed,awk这些经典工具让人眼花缭乱,而且都太老了,使用方法都不太人性化,尤其awk,语法简直反人类;所以perl,python,ruby等脚本语言相当热火,我倾向用python,但处理一些简单任务python写的还是比较麻烦,无法一行命令解决,直到我发现了它-Pyp!
(Pyed piper)–一个python写的类似sed,awk的文本处理工具,简单优雅而强大~
安装:
ubuntu官方源就有:
1 | aptitude install pyp |
基本使用:
echo ‘string’ | pyp “命令”
一些例子:
pyp的命令用双引号””包围起来,双引号里字符串用单引号’包围
变量p:将每行作为一个字符串,p就是这这个字符串,python的字符串方法都可以用,譬如字符替换:
1 | cat test .txt |pyp "p.replace('123','abc')" |
变量pp:将整个文本当做一个列表,每行是个列表元素,列表方法都可以使用,譬如行排序:
1 | cat test .txt |pyp "pp.sort()" |
管道:
pyp的命令可以内嵌管道,此时管道后p或pp代表前一个命令的输出,类似unix下的标准管道:
1 | echo 'FOO IS AN ' | pyp p.replace( 'FOO' , 'THIS' )|p+ 'EXAMPLE' " |
这个例子通过管道将replace后的字符串再当做p,增加了额外字符串’EXAMPLE’
分割:
1 | echo /this/is/a/splitting/example | pyp "p.split('/')" |
将产生一个有序号的输出
算数运算:
算数运算要用()包裹起来
echo 'qwe665' | pyp "(int(p[3:]) + 1)"
同时处理两个文本:
使用“–text_file”标识可以操处理第二个文本,类似于”p””pp”,第二个文本行和整体用变量”fp””fpp”替代:
cat a.txt | pyp "p + fp" --text_file b.txt
正则表达式:
pyp也支持正则,p.re(正则表达式)就行
cat a.txt | pyp "p.replace(p.re('^#.*'),'')"
这句就删掉所有注释行
特殊变量:
p
pporiginal //original line by line input to pypo //same as originalsp //second steam line input, just like p, but from all non-flag arguments AFTER pypquote //a literal ” (double quotes can’t be used in a pyp expression)paran //a literal ‘dollar //a literal $n //line counter (1st line is 0, 2nd line is 1,…use the form “(n+3)” to modify this value.nk //n + 1000date //date and time. Returns the current datetime.datetime.now() object.pwd //present working directoryhistory //history array of all previous results: so pyp “a|u|s|i|h[-3]” shows eval of sh //same as historyletters //abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZdigits //0123456789punctuation //!”#$%&'()*+,-./:;<=>?@[]^_{|}~`与split和join有关的变量:
s OR slash //p split/joined on “/”
d OR dot //p split/joined on “.”w OR whitespace //p split on whitespace (on spaces,tabs,etc), joined on spacesu OR underscore //p split/joined on ‘_’c OR colon //p split/joined on ‘:’mm OR comma //p split/joined on ‘,’m OR minus //p split/joined on ‘-‘a OR all //p split on [‘ ‘-_=$…] (on “All” metacharacters)与p有关变量:
p.dir path DIRECTORY
p.file path FILEp.ext path EXTENSION行级操作:
pyp “p” //直接打印各行
pyp “p +’FOO'” //每行append字符串pyp “p +’FOO’| p + o” //append的新字符串再与老字符串做操作pyp “p.replace(‘FOO’,’GOO’)” //字符串替换pyp “p.kill(‘GOO’)” //删除特定字符串string substitution pyp “‘%s FOO %s %s GOO’%(p,p,5)”
pyp “p.split(‘FOO’)” //分割成列表
pyp “slash” //用’/’分割成列表的简写pyp “slash[0]” //用’/’分割成列表并选取第一列pyp “s[2:6]” //用’/’分割成列表并选取多列pyp “s[2:6] | s” //用’/’分割成列表并选取多列再用’/’拼接echo ‘qwe665′ | pyp “(int(p[3:]) + 1)” //算数操作(要用()包围)pyp “p.replace(p.re(REGEX),STR)” //正则表达式pyp “p.letters()” //只输出字符pyp “p.digits()” //只输出数字pyp “p.punctuation()” //只输出标点pyp “p.clean(DELIM)” //处理乱码字符,将其替换为DELIM文本当做列表操作:
pyp “pp” //输出整个文本
pyp “pp.sort()” //排序pyp “pp.uniq” //去重pyp “pp.oneline” //合并所有列表元素到一行字符串,元素间以空格分开pyp “pp.unlist()” //不知道什么意思pyp.divide(N) //每N个元素合并一个新列表pyp “pp.before(‘FOO'[,n])” //输出指定字符串的上面n行,默认为一行pyp “pp.after(‘FOO'[,n])” //输出指定字符串的下面n行,默认为一行pyp “pp.matrix(‘FOO'[,n])” //输出指定字符串的上下面各n行,默认为一行pyp “[x for x in pp]” //遍历列表pyp “pp.sort() | p” //文本当做列表处理完再转换成文本pyp “pp.delimit(DELIM)” //自定义分隔符而不是默认的换行符相关文章