【问题标题】:How do I extract text from a file in a bash script如何从 bash 脚本中的文件中提取文本
【发布时间】:2014-04-26 07:13:21
【问题描述】:

我正在尝试从多行文件中提取文本。例如 我需要将所有文本从“Section 1.0”提取到“Section 3.0”

这可以在多行上。

我的代码可以运行,但看起来笨拙且缓慢。有一个更好的方法吗? 赛德? 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

【问题讨论】:

    标签: regex bash sed scripting


    【解决方案1】:

    使用 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 部分在第 3 部分之前。代码就是这样,所以实际的部分标题不会被写出来。
    【解决方案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 参数。)

    【讨论】:

      【解决方案3】:

      awk也可以用:

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

      【讨论】:

        猜你喜欢
        • 2013-11-06
        • 1970-01-01
        • 1970-01-01
        • 2020-06-18
        • 2019-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多