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

    相关文章

  • 相关阅读:
    c#两级菜单menu的动态实现
    单引号写入数据库,并结合写成函数和动静态类中方法对比小结
    google地图路径查询
    c# 图像旋转
    google地图简单
    asp.net gridview 添加属性
    linq to entity Oracle 执行存储过程或函数
    c# 判断非法字符
    c# 写入文件
    google map Inspecting DirectionsResults
  • 原文地址:https://www.cnblogs.com/DjangoBlog/p/5783175.html
Copyright © 2011-2022 走看看