Pyp–一个替代sed,awk的文本处理工具

Python09

Pyp–一个替代sed,awk的文本处理工具,第1张

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

Pyp(Pyed piper)–一个python写的类似sed,awk的文本处理工具,简单优雅而强大~

** 安装:**

ubuntu官方源就有:

aptitude install pyp

基本使用:

echo ‘string’ | pyp “命令”

变量p:

将每行作为一个字符串,p就是这这个字符串,python的字符串方法都可以用,譬如字符替换:

cat test.txt |pyp "p.replace('123','abc')"

变量pp:

将整个文本当做一个列表,每行是个列表元素,列表方法都可以使用,譬如行排序:

cat test.txt |pyp "pp.sort()"

管道:

pyp的命令可以内嵌管道,此时管道后p或pp代表前一个命令的输出,类似unix下的标准管道:

echo 'FOO IS AN ' | pyp p.replace('FOO','THIS')|p+'EXAMPLE'"

这个例子通过管道将replace后的字符串再当做p,增加了额外字符串’EXAMPLE’

分割:

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('^#.*'),'')"

这句就删掉所有注释行

PYP参考手册:

特殊变量:

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()” //不知道什么意思

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

1.注册账户以及创建仓库

要想使用github第一步当然是注册github账号了。之后就可以创建仓库了(免费用户只能建公共仓库),Create a New Repository,填好名称后Create,之后会出现一些仓库的配置信息,这也是一个git的简单教程。

2.安装客户端msysgit

github是服务端,要想在自己电脑上使用git我们还需要一个git客户端,我这里选用msysgit,这个只是提供了git的核心功能,而且是基于命令行的。如果想要图形界面的话只要在msysgit的基础上安装TortoiseGit即可。

装完msysgit后右键鼠标会多出一些选项来,在本地仓库里右键选择Git Init Here,会多出来一个.git文件夹,这就表示本地git创建成功。右键Git Bash进入git命令行,为了把本地的仓库传到github,还需要配置ssh key。

3.配置Git

首先在本地创建ssh key;

$

ssh-keygen

-t rsa -C

"[email protected]"

后面的[email protected]改为你的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。成功的话会在~/下生成.ssh文件夹,进去,打开id_rsa.pub,复制里面的key。

回到github,进入Account Settings,左边选择SSH Keys,Add SSH Key,title随便填,粘贴key。为了验证是否成功,在git bash下输入:

$

ssh

-T [email protected]

如果是第一次的会提示是否continue,输入yes就会看到:You’ve successfully authenticated, but GitHub does not provide shell access 。这就表示已成功连上github。

接下来我们要做的就是把本地仓库传到github上去,在此之前还需要设置username和email,因为github每次commit都会记录他们。

$ git config --global user.name

"your name"

$ git config --global user.email

"[email protected]"

进入要上传的仓库,右键git bash,添加远程地址:

$ git remote add origin [email protected]:yourName/yourRepo.git

后面的yourName和yourRepo表示你再github的用户名和刚才新建的仓库,加完之后进入.git,打开config,这里会多出一个remote “origin”内容,这就是刚才添加的远程地址,也可以直接修改config来配置远程地址。

4.提交、上传

接下来在本地仓库里添加一些文件,比如README,

$ git add README

$ git commit -m

"first commit"

上传到github:

$ git push origin master

git push命令会将本地仓库推送到远程服务器。

git pull命令则相反。

修改完代码后,使用git status可以查看文件的差别,使用git add 添加要commit的文件,也可以用git add -i来智能添加文件。之后git commit提交本次修改,git push上传到github。

5.gitignore文件

.gitignore顾名思义就是告诉git需要忽略的文件,这是一个很重要并且很实用的文件。一般我们写完代码后会执行编译、调试等操作,这期间会产生很多中间文件和可执行文件,这些都不是代码文件,是不需要git来管理的。我们在git status的时候会看到很多这样的文件,如果用git add -A来添加的话会把他们都加进去,而手动一个个添加的话也太麻烦了。这时我们就需要.gitignore了。比如一般c#的项目我的.gitignore是这样写的:

bin

*.suo

obj

bin和obj是编译目录,里面都不是源代码,忽略;suo文件是vs2010的配置文件,不需要。这样你在git status的时候就只会看到源代码文件了,就可以放心的git add -A了。

6.tag

我们可以创建一个tag来指向软件开发中的一个关键时期,比如版本号更新的时候可以建一个“v2.0”、“v3.1”之类的标签,这样在以后回顾的时候会比较方便。tag的使用很简单,主要操作有:查看tag、创建tag、验证tag以及共享tag。

6.1查看tag

列出所有tag:

git tag

这样列出的tag是按字母排序的,和创建时间没关系。如果只是想查看某些tag的话,可以加限定:

git tag -l v1.*

这样就只会列出1.几的版本。

6.2创建tag

创建轻量级tag:

git tag v1.0

这样创建的tag没有附带其他信息,与之相应的是带信息的tag:

git tag -a v1.0 -m

'first version'

-m后面带的就是注释信息,这样在日后查看的时候会很有用,这种是普通tag,还有一种有签名的tag:

git tag -s v1.0 -m

'first version'

前提是你有GPG私钥,把上面的a换成s就行了。除了可以为当前的进度添加tag,我们还可以为以前的commit添加tag:

#首先查看以前的commit

git log --oneline

#假如有这样一个commit:8a5cbc2 updated readme

#这样为他添加tag

git tag -a v1.1 8a5cbc2

6.3删除tag

很简单,知道tag名称后:

git tag -d v1.0

6.4验证tag

如果你有GPG私钥的话就可以验证tag:

git tag -v

v1.0

6.5共享tag

我们在执行git push的时候,tag是不会上传到服务器的,比如现在的github,创建tag后git push,在github网页上是看不到tag的,为了共享这些tag,你必须这样:

git push origin --tags