zoukankan      html  css  js  c++  java
  • Pyp 替代sed,awk的文本处理工具

    Linux上文本处理工具虽不少,像cut,tr,join,split,paste,sort,uniq,sed,awk这些经典工具让人眼花缭乱,而且都太老了,使用方法都不太人性化,尤其awk,语法简直反人类;所以perl,python,ruby等脚本语言相当热火,我倾向用python,但处理一些简单任务python写的还是比较麻烦,无法一行命令解决,直到我发现了它-Pyp!

    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
    pp
    original        //original line by line input to pyp
    o            ​//same as original
    sp            //second steam line input, just like p, but from all non-flag arguments AFTER pyp
    quote            ​//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 + 1000
    date            //date and time. Returns the current datetime.datetime.now() object.
    pwd            //present working directory
    history            ​//history array of all previous results: so pyp “a|u|s|i|h[-3]” shows eval of s
    h            //same as history
    letters            //abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
    digits            ​//0123456789
    punctuation        //!”#$%&'()*+,-./:;<=>?@[]^_{|}~`

    与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 spaces
    u  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 FILE
    p.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)”        //自定义分隔符而不是默认的换行符

    相关文章

  • 相关阅读:
    HDU2586 How far away?(tarjan的LCA)
    You Raise Me Up
    POJ2891 Strange Way to Express Integers(中国剩余定理)
    POJ2142 The Balance(扩展欧几里得)
    HDU 1166模仿大牛写的线段树
    NetWord Dinic
    HDU 1754 线段树裸题
    hdu1394 Minimum Inversion Number
    hdu2795 Billboard
    【完全版】线段树
  • 原文地址:https://www.cnblogs.com/DjangoBlog/p/5783175.html
Copyright © 2011-2022 走看看