加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 用于在两个字符串之间提取文本的sed

发布时间:2020-12-14 06:27:14 所属栏目:百科 来源:网络整理
导读:请帮我使用sed. 我有一个像下面这样的文件. START=A xxxxx xxxxxENDSTART=A xxxxx xxxxxENDSTART=A xxxxx xxxxxENDSTART=B xxxxx xxxxxENDSTART=A xxxxx xxxxxENDSTART=C xxxxx xxxxxENDSTART=A xxxxx xxxxxENDSTART=D xxxxx xxxxxEND 我想在START = A,END之
请帮我使用sed.
我有一个像下面这样的文件.
START=A
  xxxxx
  xxxxx
END
START=A
  xxxxx
  xxxxx
END
START=A
  xxxxx
  xxxxx
END
START=B
  xxxxx
  xxxxx
END
START=A
  xxxxx
  xxxxx
END
START=C
  xxxxx
  xxxxx
END
START=A
  xxxxx
  xxxxx
END
START=D
  xxxxx
  xxxxx
END

我想在START = A,END之间得到文本.
我使用了以下查询.

sed '/^START=A/,/ ^END/!d' input_file

这里的问题是,
我正进入(状态

START=A
  xxxxx
  xxxxx
END
START=D
  xxxxx
  xxxxx
END

代替

START=A
  xxxxx
  xxxxx
END

Sed贪婪地发现.

请帮我解决这个问题.

提前致谢.

我可以使用AWK实现上述目标吗?

sed -n '/^START=A$/,/^END$/p' data

-n选项表示默认不打印;然后脚本说’在包含START = A和下一个END的行之间打印.

你也可以用awk做到这一点:

A pattern may consist of two patterns separated by a comma; in this case,the action is performed for
all lines from an occurrence of the first pattern though an occurrence of the second.

(来自Mac OS X上的man awk).

awk '/^START=A$/,/^END$/ { print }' data

鉴于问题中数据文件的修改形式:

START=A
  xxx01
  xxx02
END
START=A
  xxx03
  xxx04
END
START=A
  xxx05
  xxx06
END
START=B
  xxx07
  xxx08
END
START=A
  xxx09
  xxx10
END
START=C
  xxx11
  xxx12
END
START=A
  xxx13
  xxx14
END
START=D
  xxx15
  xxx16
END

使用GNU sed或Mac OS X(BSD)sed,使用GNU awk或BSD awk的输出是相同的:

START=A
  xxx01
  xxx02
END
START=A
  xxx03
  xxx04
END
START=A
  xxx05
  xxx06
END
START=A
  xxx09
  xxx10
END
START=A
  xxx13
  xxx14
END

请注意我是如何修改数据文件的,以便更容易看到打印的各种数据块来自文件.

如果你有不同的输出要求(例如’只有START = A和END’之间的第一个块,或’只有最后一个……’),那么你需要在问题中更清楚地表达出来.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读