Bash - 使用正则表达式从文件中提取一些字符串

时间:2016-05-09 18:22:01

标签: regex bash grep

我有以下文件:

some lines = \
   some params

SUBDIRS = \
    text1 \
    text2 \
#  commented text
   text3 \
       text4 \

OTHERS = \
     other text here \

我想提取一个包含text1text2text3text4的列表。 我该怎么办?

2 个答案:

答案 0 :(得分:1)

这将提取SUBDIRS之后但在OTHERS之前的所有行,不包括以#开头或为空的行:

$ awk '/OTHERS/{f=0} f && /./ && !/^#/{print} /SUBDIRS/{f=1}' file
    text1 \
    text2 \
   text3 \
       text4 \

如何运作

这个程序使用一个变量f:当我们处于所需的行范围内时f为1而其他地方为0。

  • /OTHERS/{f=0}

    如果我们已达到OTHERS,则将f设置为零。

  • f && /./ && !/^#/{print}

    如果f非零(f该行不为空(/./,则该行不从#!/^#/)开始,然后打印此行。

  • /SUBDIRS/{f=1}

    如果我们到达包含SUBDIRS的行,则将f设置为1.

稍微简短的表格

因为print是未指定操作时的默认操作,我们可以从脚本中省略它:

$ awk '/OTHERS/{f=0} f && /./ && !/^#/; /SUBDIRS/{f=1}' file
    text1 \
    text2 \
   text3 \
       text4 \

替代输出格式

这将删除尾随\并将所有输出组合成一行:

$ awk '/OTHERS/{f=0} $NF=="\\"{$NF=""} f && /./ && !/^#/{a=a" "$0} /SUBDIRS/{f=1} END{print a}' file
 text1  text2  text3  text4

答案 1 :(得分:0)

试试这个。我希望SPACE_TAB显然是一个空格加一个标签。

Module