Linux正则表达式
.
匹配任意单字符^
行头匹配声明$
行尾匹配(写在单词末)^$
空行匹配a*
匹配任意某字符a(0个或以上).*
匹配任意个任意字符(相当于一般匹配的*)a/{n/}
匹配n个a,另外有/{n,/}
匹配n个以上a,/{n,m/}
匹配n到m个的a. n和m为0-255.[a-z]
一般意义匹配的指定范围匹配[a-zA-Z]*
匹配任意单词[^a-z]
匹配任意非a-z, 中括号内的^表示非.(一般匹配中使用!)\
反义(屏蔽特殊含义)\<
和\>
这两个符合分别表示非字符(0-9,a-Z) 可以用于精确匹配[[:upper:]]
,[[:lower:]]
,[[:digit:]]
,[[:alnum:]]
,[[:alpha:]]
代表大写,小写,数字,数字或字母,字母[[:space:]]
代表Tab和空格\w
就是所有0-9a-Z,相当于[[:alnum:]]\W
\w的反置,也就是非单词.\b
单词锁定符,如’\bhello\b’
支持单引号和双引号包含字符串/表达式, 对于pattern中使用变量时,必须使用"$a"
的表达防止误解.对于字符串建议用'string'
括起来
sed 非交互文档编辑,流编辑器
sed全名叫stream editor,流编辑器. sed功能很强大, 在linux命令中有着不可替代的作用.其主要作用包括显示匹配行, 进行替换等. 辅助awk, 有时配合grep和find, 可以进行很多功能. sed也是支持正则表达式的~
###基本语法
- sed [option] sed-command inputfile
命令部分要加引号
- sed [option] -f commandfile inputfile
option:
-n
显示打印定位匹配行, 不加则会非定位的所有行都输出
-f
指定sed脚本
-e
添加脚本命令到运行命令, 用于多个指令一起进行例如实现p和=的功能,要-e ‘/hi/’p -e ‘/hi/’= 这样写命令
-i
直接修改文件内容
command: =定位+编辑
定位:
x
某一行;x,y
x到y行; 如’1,$p’ 打印所有行,$是最末行的意思x,y!
非x到y的行.注意使用时’1,3!’p 都则!p会被翻译/string/
包含string的行,里面可含有[0-9]这种表达也支持反斜线, 最好将’/string/’p 这样表达(p在引号外), .*代表0-任意通配, .为任意字符x,/string/
从x行到包含string的行.要是x行包含string,则跳到下一个含string的行./string/,x
string所有匹配都会打印,从第一个string匹配的行到x行的都打印.
编辑
p
输出编辑行=
打印编辑行行号d
删除编辑行w
结果写入到w filename.r
读某个文件,写到编辑行之下.r filenameq
首次遇上定位符合后退出
替换:
s/origin/sub/
将origin的内容替换为sub的内容,现在默认就是全局了.其中的origin/sub支持正则表达式,如^
代表所有行开头,$
代表所有行结尾.
- /sub/后可以跟选项,
g
是全局,w fileA
是把替换的行写入到文件fileA里,p
打印编辑行(用于-n) . s/origin/sub/1
替换每一行的第一个origin,s/origin/sub/3g
只替换每一行的第三个以后的origin'1,3s/a/A/g; 3,$s/This/That/g'
替换多个模式, 相当于-e '1,3s/a/A/g' -e '3,$s/This/That/g'
sed 's/my/[&]/g' my.txt
表示把每个my变成[my],&
用来当做被匹配的变量
sed脚本 #!/bin/sed -f
开头
例如:
sed -e "s/total_atoms_Hom/$TotalAtoms/" -e "s/ligand_ending_Hom/$LigEnd/" mm_pbsa.in >mm_pbsa_revised.in
进行替代.注意这里要用变量,如果用’…‘则不会翻译变量,因此要用双引号. 没有-n 所以修改完全输出
举例:
使用p(rint)显示行: sed -n '2p' temp.txt 只显示第2行,使用选项n
打印范围: sed -n '1,3p' temp.txt 打印第1行到第3行
打印模式: sed -n '/movie/'p temp.txt 打印含movie的行
使 用模式和行号查询: sed -n '3,/movie/'p temp.txt 只在第3行查找movie并打印
显示整个文件: sed -n '1,$'p temp.txt $为最后一行
任意字符: sed -n '/.*ing/'p temp.txt 注意是.*ing,而不是*ing
打印行号: sed -e '/music/=' temp.txt
附加文本:(创建sed脚本文件)chmod u+x script.sed,运行时./script.sed temp.txt
#!/bin/sed -f
/name1/ a/ #a/表示此处换行添加文本
HERE ADD NEW LINE. #添加的文本内容
插入文本: /name1/ a/ 改成 4 i/ 4表示行号,i插入
修改文本: /name1/ a/ 改 成 /name1/ c/ 将修改整行,c修改
删除文本: sed '1d' temp.txt 或者 sed '1,4d' temp.txt, sed -e '5,$d' file 删除5行以后内容并显示
替 换文本: sed 's/source/OKSTR/' temp.txt 将source替换成OKSTR
sed 's//$//g' temp.txt 将文本中所有的$符号全部删除
sed 's/source/OKSTR/w temp2.txt' temp.txt 将替换后的记录写入文件temp2.txt
替换修改字符串: sed 's/source/"ADD BEFORE" &/p' temp.txt
结果将在source字符串前面加上"ADD BEFORE",这里的&表示找到的source字符并保存
sed结果写入到文件: sed '1,2 w temp2.txt' temp.txt
sed '/name/ w temp2.txt' temp.txt
从文件中读文本: sed '/name/r temp2.txt' temp.txt
在每列最后加文本: sed 's/[0-9]*/& Pass/g' temp.txt
从 shell向sed传值: echo $NAME | sed "s/go/$REP/g" 注意需要使用双引号
's//.$//g' 删除以句点结尾行
'-e /abcd/d' 删除包含abcd的行
's/[][][]*/[]/g' 删除一个以上空格,用一个空格代替
's/^[][]*//g' 删除行首空格
's//.[][]*/[]/g' 删除句号后跟两个或更多的空格,用一个空格代替
'/^$/d' 删除空行
's/^.//g' 删除第一个字符,区别 's//.//g'删除所有的句点
's/COL/(.../)//g' 删除紧跟COL的后三个字母
's/^////g' 删除路径中第一个/
awk
awk [-F seperator] 'command' inputfile
文档行处理工具
-F 是指明分隔符
-f 可以用于指定脚本运行,不需command
- ‘command’ 一般格式为 ‘正则表达式匹配 {动作}’
- ‘command’ 内可含有BEGIN {..} {…} END{…} 这种结构,用在处理前和后
正则
支持或|
支持\
$^.
[]
|
()
*
?
+
匹配
正则表达式条件 ~和!~(不匹配), 用()括起来,前面可以加if成判断语句
‘{if ($4 ~ /Brown/) print $0}’
匹配后面紧跟正则,用/abc/来表示.
用/abc/只能部分匹配, 精确匹配请用==
‘#3==”48” {print $0}’
注意条件匹配if (~)语句放在{}内和动作一起, 作为整体动作,否则遵循’正则表达式匹配 {动作}’的格式
if 条件中支持||
, &&
, !
与或非
例如:
awk '{print $2}' file.txt 直接抓取第二列,分隔符默认空格.如果需要可用-F '|'之类指定
awk -F : '{print $1}' file.txt 抓取第一列. 注意用'..'否则变成系统输入变量
grep 文档内容匹配搜索工具
grep pattern files
- -c 只计数,共多少行
- -C num 除了返回的匹配行外,其上下num行也返回
- -v 显示不包含匹配的所有行
- -n 显示行号
- -i 不区分大小写
- -E 开启扩展模式匹配, | 表示或, (egrep)
- -F (fgrep相当)
-E的扩展集
- a+ 一个或多个a
- ? 0个或以上的字符
- | 或
- () 分组,如
(able|rs)
表示able或者rs
举例
grep -C 1 '@<TRIPOS>MOLECULE' filename | grep mol2
#提取出分子名称
find
find * -type d -exec mkdir -p utf/{} \;
复制(新建)当前目录文件夹结构到utf到.
Reference
TODO: