grep một dòng trước trận đấu cộng với trận đấu


8
zzzzzzzzz
aaaaaaaaa
bbbbbbbbb &
ccccccccc &
ddddddddd
hhhhhhhhh
eeeeeeeee
fffffffff &
ggggggggg &

trong dòng trên, điều tôi muốn là grep/ sed/ awk(bất kỳ phương thức nào cũng được) có dòng có &dấu cộng với một dòng trên đầu chúng. vì vậy, ví dụ đầu ra mong muốn sẽ như sau:

aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &

Sau đây là những gì tôi đã cố gắng không có may mắn.

egrep "&" | -b 1 file.txt

Câu trả lời:


16

Bạn có thể làm:

grep -B 1 '&$' your_file

Điều này sẽ tìm kiếm các dòng kết thúc bằng &, loại bỏ $để phù hợp với các dòng với &bất cứ nơi nào trong chúng.

Công -Btắc cho biết grepcác dòng "bối cảnh" xuất hiện trước các dòng khớp. Trong trường hợp này, vì bạn muốn một dòng bối cảnh, bạn cần -B 1.

Chuyển đổi này có sẵn trong GNU grepnhưng không phải trong tiêu chuẩn POSIX.

Đây là một sedgiải pháp đơn giản sẽ giúp ích trong trường hợp bạn không có GNU grep:

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

Làm thế nào nó hoạt động

  • Công -ntắc chặn hành động "in" mặc định củased
  • /&/!Ncó nghĩa là: nếu dòng hiện tại không chứa &, nối thêm dòng tiếp theo vào không gian mẫu.
  • /&/pcó nghĩa là: khớp &và in không gian mẫu.

2
@RanaKhan Chào mừng bạn đến với Stack Exchange :) Tôi rất vui vì tôi có thể giúp đỡ. Xin đừng quên đánh dấu câu trả lời này là được chấp nhận (sử dụng dấu tick bên dưới các nút bỏ phiếu bên cạnh câu trả lời) nếu nó giúp giải quyết vấn đề của bạn để những người khác duyệt trang web biết rằng vấn đề này đã được giải quyết.
Joseph R.

+1 cho biến thể khi GNU/grepkhông có sẵn, cảm ơn!
ckujau

3

Đây là cách mô phỏng grep -B1với sed:

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

Nó rất giống với cái ở đây . Cũng giống như cái khác, nó đọc trong Ndòng ext nhưng lần này, nó Pgợi ý đến \newline đầu tiên nếu không gian mẫu khớp với nhau , và sau đó, giống như dòng kia, Dchạy lên \newline đầu tiên và khởi động lại chu kỳ. Vì vậy, với đầu vào mẫu của bạn:

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

đầu ra:

aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &

Một lần nữa, để xem cách nó hoạt động, hãy thêm ltrước và sau Nđể xem không gian mẫu ::

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

ví dụ với một tệp mẫu:

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

đây là các lệnh sedthực thi và đầu ra tương ứng:

cmd đầu ra 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.