如何从bash脚本中的文件中提取文本

时间:2014-03-19 19:20:40

标签: regex bash sed scripting

我想从多行文件中提取文本。例如 我需要从"第1.0节"中提取所有文本。到"第3.0节"

这可以在很多方面。

我的代码有效,但看起来很笨拙和缓慢。有一个更好的方法吗? SED? reg表达?

flag="false"

for line in ${textFile}; 
do
   if [ "$line" == "Section 3.0" ]; then
      flag="false"
   fi
   if [ "$flag" == "true" ]; then
      temp_var+=$line
   fi
   if [ "$line" == "Section 1.0" ]; then
      flag="true"
   fi
done

3 个答案:

答案 0 :(得分:3)

使用sed你可以这样做:

sed -n '/Section 1\.0/,/Section 3\.0/p' file

编辑:要忽略开始和结束模式,请使用:

sed -n '/Section 1\.0/,/Section 3\.0/{/Section [13]\.0/!p;}' file

awk解决方案:

awk '/Section 1\.0/{flag=0} flag{print} /Section 3\.0/{flag=1}' file

答案 1 :(得分:2)

sed -n '/Section 1\.0/,/Section 3\.0/p' file

将从file打印与第一个正则表达式匹配的行之间的所有行,通过与第二个表达式匹配的下一行。如果有多个这样的匹配,它们将以翻转方式打印(查找模式1,通过模式2打印,查找模式1 ......)

如果您只想要第一个这样的部分,则可以在找到结束条件时退出:

sed -n '/Section 3\.0/q;/Section 1\.0/,$p' file

这将排除与结束条件匹配的行(猜测那是你真正想要的)。为简单起见,假设您在1.0节之前没有第3.0节。 (某些sed方言可能需要略有不同的语法;分号可能必须更改为换行符,或者脚本分为两个单独的-e个参数。)

答案 2 :(得分:0)

awk也可以使用:

awk '/Section 3\.0/{f=0} f; /Section 1\.0/{f=1}' file