我试图匹配嵌套文本,包括嵌套文本前紧靠sed或grep的行。
我正在使用的示例:
pattern3
abcde
fghij
pattern3
pattern1
abcde
fghij
pattern1
pattern1
klmno
pattern1
pattern3
abcde
pattern1
pqrst
patterh3
fghij
请注意,在嵌套文本的前面总是有四(4)个空格。另外,在匹配模式之后,可能会嵌套嵌套文本,也可能不会嵌套嵌套文本。
我对所有pattern1
行,以及pattern1
之后的以空格开头的行感兴趣。
我正在寻找的输出是:
pattern1
abcde
fghij
pattern1
pattern1
klmno
pattern1
pattern1
pqrst
我和以下人有亲密关系
sed -n '/^pattern1/,/^pattern1/p' data.txt
但是似乎在pattern1
右侧匹配之后跳过嵌套的文本,然后转到下一个迭代。
我也尝试sed -n '/^\"pattern1\"$/,/^\"pattern1\"$/p' data.txt | sed '1d;$d'
也不运气。
答案 0 :(得分:2)
使用GNU sed:
sed -n '/pattern1/{p;:x;n;s/^ .*/&/;p;tx}' file
或简化:
sed -n '/pattern1/{p;:x;n;p;/^ /bx}' file
输出:
pattern1 abcde fghij pattern1 pattern1 klmno pattern1 pattern1 pqrst
答案 1 :(得分:1)
请您尝试以下。
awk '/pattern[23]/{flag=""} /pattern1/{flag=1} flag' Input_file
OR
awk '/pattern[^1]/{flag=""} /pattern1/{flag=1} flag' Input_file
说明: 也在此处添加说明。
awk '
/pattern[^1]/{ ##Checking condition if a line is having string pattern with apart from digit 1 in it then do following.
flag="" ##Nullifying variable flag value here.
}
/pattern1/{ ##Checking condition here if a line is having string pattern1 then do following.
flag=1 ##Setting value of variable flag as 1 here.
}
flag ##Checking condition if value of flag is NOT NULL then print the line value.
' Input_file ##Mentioning Input_file name here.
答案 2 :(得分:1)
$ awk '/^[^ ]/{f=/^pattern1$/} f' file
pattern1
abcde
fghij
pattern1
pattern1
klmno
pattern1
pattern1
pqrst
答案 3 :(得分:1)
这可能对您有用(GNU sed):
sed '/^\S/h;G;/pattern1/P;d' file
将当前模式存储在保留空间中,并将其附加到每一行。如果当前图案是pattern1,则打印当前行和/或删除当前行。