我有这样的文本文件,我想解析:
Host server1
option1 value1
option2 value2
option3 value3
...
Host server2
option1 value1
option2 value2
option3 value3
...
Host server3
option1 value1
...
目标是当我向输入提供名称(例如 server2)时,它应该返回:
Host server2
option1 value1
option2 value2
option3 value3
...
然后我尝试编写下面的正则表达式并在在线正则表达式游乐场上测试它,有用正如预期的那样。
/((Host server2\n)(^ +.+\n*)+)/gm
但是我不知道如何将此正则表达式应用于某些 Linux 工具,例如grep
, sed
,perl
或awk
。我已经尝试过grep
,但它不适用于多行搜索。它通过使用-z
flag 来实现,但仍然无法使正则表达式工作(尝试使用-Pzo
,但没有工作)。我不太熟悉perl
or awk
(用于正则表达式)。
所以我当前的解决方案是使用sed -n '/foo/,/bar/p' input_file
:
string="server1"
search=$(cat input_file | grep Host | grep -w -A1 "$string")
foo=$(head -1 <<< "$search")
bar=$(tail -1 <<< "$search")
sed -n "/$foo/,/$bar/p" input_file | head -n -1
这按预期工作,但我想看看正则表达式方法。还有一件事,我不想安装任何额外的工具。
答案1
你就快到了。 grep 正则表达式不喜欢坐在斜杠内的一个小细节/.../
- 还有一件事,我们打开多行匹配模式
(?m)
,这样我们可以使用插入符号^
来表示行的开始(换行符右边的位置)以及字符串的最开始,也可以通过来访问\A
。 - grep 输出它 grep 后缀为 NULL 的块,因此我们需要将其删除。
- 休息就是你的全部内容,所以你无论如何都知道你的正则表达式是如何匹配的。
grep -Pzo '(?m)((^Host server2\n)( +.+\n*)+)' file | tr -d '\0'