[笔记]使用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