[笔记]使用shell命令(awk,sed,grep)处理几个特征字符串之间的文本

问题一:提取一行文本之中几个特征字符串之间的文本。

例:从文本 "/directory1/WantedString/directory2" 中提取"directory1/"和"/directory2"之间的部分,即"WantedString"

1、使用sed

1) 逐步替换,模式:sed -n 's/pattern1//;s/pattern2//;p'

echo "/directory1/WantedString/directory2" | sed -n 's%/directory1/%%;s%/directory2%%;p'

2) 引用不想替换的部分,模式:sed -n 's/pattern1\(.*\)pattern2/\1/p' 或 sed -r 's/pattern1(.*)pattern2/\1/g'

echo "/directory1/WantedString/directory2" | sed -n 's%/directory1/\(.*\)/directory2%\1%p'

2、使用awk

1) 用特征分隔符分成若干段,输出第n段。

echo "/directory1/WantedString/directory2" | awk -F "/" '{print $3}'

2) 把特征字符串替换掉,输出剩下的部分。

echo "/directory1/WantedString/directory2" | awk '{gsub("directory[0-9]|/","",$0);print}'

3、使用grep

echo "/directory1/WantedString/directory2" | grep -oP "(?<=/directory1/).*(?=/directory2)"

如果有更多特征字符串,例如"p1Hellop2,p3Worldp4!"

用awk和sed都可以把"Hello,World!"提取出来,

但grep似乎就不行了。###### ???

 

问题二:提取特征字符串所在行之间的文本

例:文件"a.txt"存放文本如下,要求提取出"Hi "和"patterns"之间的文本

Hi I would like
to print text
between these
patterns

1、sed

sed -n '/^Hi/,/patterns/{s/^Hi //;/^patterns/d;p;}' a.txt

注释:"/^Hi/,/patterns/" 取得Hi和patterns之间的行(包括Hi和patterns),然后"s/^Hi //"把"Hi "替换掉,接着"/^patterns/d" 把patterns所在行删掉,最后打印输出

2、awk

awk '/patterns/{f=0}/^Hi /{gsub("^Hi ","",$0);f=1}{if(f==1)print}' a.txt
awk 'sub(/^Hi /,""){f=1} /patterns/{f=0} f' a.txt

注释:定义一个flag: f,当行有patterns时,f为0,当行以"Hi "开头时,替换掉"Hi "并令f为1,当f为1时打印所在行。

 

参考资料:

http://stackoverflow.com/questions/13023595/sed-awk-print-text-between-patterns-spanned-across-multiple-lines

posted @ 2014-04-23 13:50  张志军  阅读(707)  评论(0编辑  收藏  举报