Sed三种模式搜索

时间:2014-10-31 11:36:25

标签: unix sed

说我有一个文件如下。我想在[和]之间进行三种模式搜索,其中包含我的搜索字符串(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|.)*]',但无法弄清楚如何单独获得想要的模式。请指教

4 个答案:

答案 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
]