In các mẫu chưa từng có, sử dụng grep với các mẫu từ tệp


14

mẫu.txt:

"BananaOpinion"
"ExitWarning"
"SomeMessage"
"Help"
"Introduction"
"MessageToUser"

Chuỗi tệp

<string name="Introduction">One day there was an apple that went to the market.</string>
<string name="BananaOpinion">Bananas are great!</string>
<string name="MessageToUser">We would like to give you apples, bananas and tomatoes.</string>

Sản lượng dự kiến:

"ExitWarning"
"SomeMessage"
"Help" 

Làm thế nào để tôi in các điều khoản trong patterns.txtđó không được tìm thấy trong Strings.xml? Tôi có thể in phù hợp / chưa từng dòng trong Strings.xml, nhưng làm thế nào để in chưa từng có mô hình ? Tôi đang sử dụng ggrep (GNU grep) phiên bản 2.21, nhưng đang mở cho các công cụ khác. Xin lỗi nếu đây là bản sao của một câu hỏi khác mà tôi không thể tìm thấy.

Câu trả lời:


24

Bạn chỉ có thể sử dụng grep -ođể in phần phù hợp và sử dụng kết quả dưới dạng mẫu trong một giây grep -vtrên patterns.txttệp gốc :

grep -oFf patterns.txt Strings.xml | grep -vFf - patterns.txt

Mặc dù trong trường hợp cụ thể này, bạn cũng có thể sử dụng join+ sort:

join -t\" -v1 -j2 -o 1.1 1.2 1.3 <(sort -t\" -k2 patterns.txt) <(sort -t\" -k2 strings.xml)

Điều này khá thanh lịch .. thông minh!
XXL

Nếu bạn có nhiều tệp đầu vào (ví dụ Strings1.xmlStrings2.xml), bạn cũng sẽ cần -hcờ trên grep đầu tiên.
jayhendren

@jayhendren - vâng nhưng không phải tất cả đều grephỗ trợ tùy chọn đó. Nếu bạn có nhiều tệp đầu vào, tôi không thấy lý do tại sao bạn không thể đơn giản là cattất cả chúng và dẫn đến kết quả grep.
don_crissti

5

Cách tiếp cận tốt nhất có lẽ là những gì @don_crissti đề xuất, vì vậy đây là một biến thể trong cùng một chủ đề:

$ grep -vf <(grep -Po 'name=\K.+?"' Strings.xml) patterns.txt
"ExitWarning"
"SomeMessage"
"Help"

Điều này về cơ bản là nghịch đảo của phương pháp @ don_crissti's. Nó sử dụng grep với biểu thức chính quy tương thích Perl ( -P) và công -otắc để chỉ in phần phù hợp của dòng. Sau đó, regex tìm kiếm name=và loại bỏ nó ( \K), và sau đó tìm kiếm một hoặc nhiều ký tự cho đến ký tự đầu tiên "( .+?"). Điều này dẫn đến danh sách các mẫu có trong String.txttệp mà sau đó được chuyển làm đầu vào cho một grep ( grep -v) ngược bằng cách sử dụng thay thế quá trình ( <(command)).


2

Tôi sẽ sử dụng cut, có lẽ. Đó là, nếu, khi nó xuất hiện, bạn biết nơi mong đợi chuỗi trích dẫn mà bạn đang tìm kiếm.

Nếu tôi làm:

{   cut  -sd\" -f2 |
    grep -vFf- pat
}   <<\IN
#   <string name="Introduction">One day there was an apple that went to the market.</string>
#   <string name="BananaOpinion">Bananas are great!</string>
#   <string name="MessageToUser">We would like to give you apples, bananas and tomatoes.</string>
IN

... Sau khi lưu bản sao ví dụ của riêng tôi patterns.txtvào patvà chạy lệnh trên, đầu ra là:

"ExitWarning"
"SomeMessage"
"Help"

cutin để stdout chỉ thứ hai "đúp quote -delimited -field cho mỗi dòng delimiter kết hợp của đầu vào và -suppresses tất cả những người khác.

Những gì cutthực sự in tại greplà:

Introduction
BananaOpinion
MessageToUser

greptìm kiếm toán hạng tệp được đặt tên của nó cho các dòng -vkhông khớp với -Fchuỗi ixed trong -mẫu stdin của nó -f.

Nếu bạn có thể dựa vào trường được phân định thứ hai "là trường phù hợp, thì đó chắc chắn sẽ là một tối ưu hóa trên grep -Pchế độ erl bằng cách chỉ khớp các -Fchuỗi ixed và chỉ một phần nhỏ của chúng vì cutthực hiện việc nâng vật nặng - và nó thực hiện nhanh .


1
for p in $(cat patterns.txt); do if ! grep $p strings.xml &>/dev/null; then echo $p; fi; done

thật dễ hiểu nhưng có thời gian chết để sinh ra nhiều quá trình grep, một quy trình cho mỗi dòng trong samples.txt.


0

một cách khác là đặt samples.txt và String.xml vào một danh sách và tìm các hàng duy nhất

cat patterns.txt Strings.xml | grep -oFf patterns.txt | sort | uniq -u

giải trình:

cat patterns.txt Strings.xmlđặt mọi thứ vào một danh sách grep -oFf patterns.txtloại bỏ rác trên mỗi dòng. sorttự giải thích. sắp xếp tất cả các dòng. uniq -uchỉ in những dòng độc đáo.

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.