zzzzzzzzz
aaaaaaaaa
bbbbbbbbb &
ccccccccc &
ddddddddd
hhhhhhhhh
eeeeeeeee
fffffffff &
ggggggggg &
在上面的行中,我想要的是grep
// sed
(awk
任何方法都可以)有&
符号的行加上上面的一行。例如,所需的输出将如下所示:
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
它非常类似于这里有一个。就像另一个一样,它在N
ext 行中读取,但这一次,它P
会打印到第一个\n
ewline如果模式空间火柴,然后,就像另一个一样,D
删除到第一个\n
ewline 并重新开始循环。因此,根据您的示例输入:
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