说我有一个文件如下。我想在[和]之间进行三种模式搜索,其中包含我的搜索字符串(111):
Msg: [
blah abc blah
blah blah..
blah blah..
blah blah..
blah efg blah blah
blah blah..
]
Msg: [
111
]
Msg: [
222
]
我看到下面印有:
Msg: [
222
]
我尝试了pcregrep -M 'Msg:.*(\n|.)*]'
,但无法弄清楚如何单独获得想要的模式。请指教
答案 0 :(得分:1)
Sed版
sed '#n
/Msg: \[/,/]/ {
H
/Msg: \[/ x
/]/ {
x
# next search pattern is your string
s/111/&/p
}
}' YourFile
在GNU sed上使用--posix
的posix版本
答案 1 :(得分:1)
你也可以这样使用
sed -n '/Msg: \[/N;/\n111/N;/\n\]/p' File_Name
说明:
/Msg: \[/N -- If the "Msg : [" the pattern is found get the another line and append to the pattern space .
/\n111/N -- Then the new appended line is "111" again get the another line and append to the pattern space .
/\n\]/p --The last line is "]" the print the pattern space and get your expect result.
输出
Msg: [
111
]
或者您需要使用这种方式的确切模式
sed -rn '/Msg: \[/N;/\n111/N;/\n\]/s/^.*\n(.*)\n.*$/\1/p' File_Name
输出:
111
答案 2 :(得分:0)
以下是一种使用gnu awk
(Gnu到RS
中的多个字符的方式)
awk -v RS='Msg: \\[' '/111/ {print RS $0}' file
Msg: \[
111
]
告诉awk
将帖子拆分为Msg: [
,然后只选择模式并添加RS。
答案 3 :(得分:0)
仅获取数字111
,
$ pcregrep -M -o '\]\nMsg:\s*\[\n\K[^\]\[]*(?=\n\]\nMsg:)' file
111
要获得整个区块,
$ pcregrep -M -o '\]\n\KMsg:\s*\[\n[^\]\[]*\](?=\nMsg:)' file
Msg: [
111
]