Làm thế nào để đưa ra một mẫu cho dòng mới trong grep? Dòng mới ở đầu, dòng mới ở cuối. Không phải là cách biểu thức chính quy. Một cái gì đó giống như \ n.
$
. Nó hơi hạn chế, nhưng có thể sử dụng được trong những trường hợp đơn giản.
Làm thế nào để đưa ra một mẫu cho dòng mới trong grep? Dòng mới ở đầu, dòng mới ở cuối. Không phải là cách biểu thức chính quy. Một cái gì đó giống như \ n.
$
. Nó hơi hạn chế, nhưng có thể sử dụng được trong những trường hợp đơn giản.
Câu trả lời:
grep
các mẫu được khớp với các dòng riêng lẻ nên không có cách nào để một mẫu khớp với một dòng mới được tìm thấy trong đầu vào.
Tuy nhiên, bạn có thể tìm thấy các dòng trống như thế này:
grep '^$' file
grep '^[[:space:]]*$' file # include white spaces
thử pcregrep
thay vì thông thường grep
:
pcregrep -M "pattern1.*\n.*pattern2" filename
các -M
tùy chọn cho phép nó để phù hợp trên nhiều dòng, vì vậy bạn có thể tìm kiếm dòng mới như \n
.
Bạn có thể sử dụng cách này ...
grep -P '^\s$' file
-P
được sử dụng cho các biểu thức chính quy Perl (một phần mở rộng cho POSIX grep
).\s
khớp các ký tự khoảng trắng; nếu theo sau *
, nó cũng khớp với một dòng trống.^
khớp với đầu dòng. $
khớp với cuối dòng. -P
là một phần mở rộng GNU. Tôi ổn khi sử dụng nó khi tình huống yêu cầu nó (thường là lookahead / lookbehind), nhưng POSIX grep có thể làm điều này chỉ với tệp [[:space:]]
.
-P
. GNU dù sao cũng khá chuẩn. :)
brew install grep
nhận GNU grep, tính năng này vượt trội hơn theo một số cách. apple.stackexchange.com/questions/193288/…
Nhờ @jarno, tôi biết về tùy chọn -z và tôi phát hiện ra rằng khi sử dụng GNU grep với tùy chọn -P, việc so khớp với \n
là có thể . :)
Thí dụ:
grep -zoP 'foo\n\K.*'<<<$'foo\nbar'
Bản in bar
Đối với cách giải quyết khác (không sử dụng tính năng không di động -P
), bạn có thể tạm thời thay thế một ký tự dòng mới bằng ký tự khác và thay đổi lại nó, ví dụ:
grep -o "_foo_" <(paste -sd_ file) | tr -d '_'
Về cơ bản nó đang tìm kiếm kết hợp chính xác _foo_
nơi _
phương tiện \n
(như vậy __
= \n\n
). Bạn không cần phải dịch ngược lại tr '_' '\n'
, vì dù sao thì mỗi mẫu sẽ được in ở dòng mới, vì vậy chỉ cần loại bỏ _
là đủ.
<(p paste -sd_ file )
?
new line at the beginning
là một dòng trống vànew line at end
áp dụng cho mọi dòng trong tệp. Bạn có thể đăng một ví dụ?