grep 匹配前一行加上匹配

grep 匹配前一行加上匹配
zzzzzzzzz
aaaaaaaaa
bbbbbbbbb &
ccccccccc &
ddddddddd
hhhhhhhhh
eeeeeeeee
fffffffff &
ggggggggg &

在上面的行中,我想要的是grep// sedawk任何方法都可以)有&符号的行加上上面的一行。例如,所需的输出将如下所示:

aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &

以下是我尝试过但没有运气的方法。

egrep "&" | -b 1 file.txt

答案1

你可以做:

grep -B 1 '&$' your_file

这将查找以 结尾的行&,删除$以匹配&其中任意位置的行。

-B开关指示grep输出匹配行之前的“上下文”行。在这种情况下,由于您需要一行上下文,因此您需要-B 1.

该开关在 GNU 中可用grep,但不在 POSIX 标准中。

这是一个简单的sed解决方案,如果您没有 GNU ,应该会有所帮助grep

sed -n '/&/!N;/&/p' your_file

怎么运行的

  • -n开关抑制默认的“打印”操作sed
  • /&/!N意思是:如果当前行不包含&,则将下一行追加到模式空间。
  • /&/p意思是:匹配&并打印模式空间。

答案2

以下是如何进行grep -B1模拟sed

sed '$!N;/pattern/P;D' infile

它非常类似于这里有一个。就像另一个一样,它在Next 行中读取,但这一次,它P会打印到第一个\newline如果模式空间火柴,然后,就像另一个一样,D删除到第一个\newline 并重新开始循环。因此,根据您的示例输入:

sed '$!N;/&/P;D' infile

输出:

aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &

再次,要了解它是如何工作的,请l在 之前和之后添加N以查看模式空间::

sed 'l;$!N;l;/&/P;D' infile

例如带有示例文件:

zzzz &
aaaa
bbbb
cccc &
dddd &
hhhh
eeee
ffff &
gggg &

这些是执行的命令sed和相应的输出:

cmd 输出 cmd
l       zzzz &$               N # read in the next line
l       zzzz &\naaaa$         # pattern space matches so print up to \n
P       zzzz &                D # delete up to \n 
l       aaaa$                 N # read in the next line
l       aaaa\nbbbb$           D # delete up to \n (no match so no P)
l       bbbb$                 N # read in the next line
l       bbbb\ncccc &$         # pattern space matches so print up to \n
P       bbbb                  D # delete up to \n
l       cccc &$               N # read in the next line
l       cccc &\ndddd &$       # pattern space matches so print up to \n
P       cccc &                D # delete up to \n
l       dddd &$               N # read in the next line
l       dddd &\nhhhh$         # pattern space matches so print up to \n
P       dddd &                D # delete up to \n
l       hhhh$                 N # read in the next line
l       hhhh\neeee$           D # delete up to \n (no match so no P)
l       eeee$                 N # read in the next line
l       eeee\nffff &$         # pattern space matches so print up to \n
P       eeee                  D # delete up to \n
l       ffff &$               N # read in the next line
l       ffff &\ngggg &$       # pattern space matches so print up to \n
P       ffff &                D # delete up to \n
l       gggg &$               # last line so no N 
l       gggg &$               # pattern space matches so print up to \n
P       gggg &                D # delete up to \n

相关内容