有谁知道一个shell命令(egrep,grep(来查找多行的匹配项?
这是我的部分数据:
/id D4333F9F; Fri, 23 Mar 2018 16:12:13 -0300 (-03)^M
Subject: =?UTF-8?Q?(Observado)=20[Chamado=202223936]=20-=20?= =?UTF-8?Q?> Configura=C3=A7=C3=A3o=20DNS?=^M
Date: Fri, 23 Mar 2018 16:12:13 -0300^M
Content-Type: text/html; charset=UTF-8^M
Content-Transfer-Encoding: quoted-printable^M
Content-Disposition: inline^M
MIME-Version: 1.0^M
在我在这里的抨击中,我试图找到一个表达方式:">
/id D4333F9F.*
(注意.*
正则表达式以选择所有内容,直到文件结束(
窗口上插入的命令正在模拟grep
命令,但我的搜索停止^M
字符
我想继续搜索,直到标题邮件MIME-Version
(这是一个雷鸟文件(。
为了简化起见,让我们考虑一下这个文件:
$ cat file
before
/id D4333F9F 1234
another line
last line in file
您遇到的问题不是^M
。 标准grep
一次只处理一行。
使用 sed
要获取从包含/id D4333F9F
的行到文件末尾的所有内容,您可以使用几种标准工具。 例如,尝试sed
:
$ sed -n '//id D4333F9F/,$ p' file
/id D4333F9F 1234
another line
last line in file
在这里//id D4333F9F/,$ p
告诉 sed 打印任何以与/id D4333F9F
匹配的行开头并以最后一行 ($
( 结尾的行。
使用 awk
尝试awk
:
$ awk '//id D4333F9F/{f=1} f' file
/id D4333F9F 1234
another line
last line in file
在这里,//id D4333F9F/{f=1}
告诉awk在找到与/id D4333F9F
匹配的第一行时将变量f
设置为1。 最后一个f
是速记,告诉awk打印f
是否为真(意味着非空或非零(。
将 grep 与 GNU 扩展一起使用
最后,如果你的grep
有-P
扩展名(这需要GNU grep(,那么试试:
$ grep -ozP '(?s)/id D4333F9F.*' file
/id D4333F9F 1234
another line
last line in file
这里详细解释了这个 grep 代码。