Có gì khác biệt khi kết hợp một từ có / không có khoảng trắng ở cuối?


12

Tôi đang học shell-scripting và tôi đang sử dụng HackerRank. Có một câu hỏi liên quan đến sedtrên cùng một trang: lệnh 'Sed' # 1 :

Đối với mỗi dòng trong một tệp đầu vào nhất định, hãy chuyển đổi lần xuất hiện đầu tiên của từ 'the' với 'this'. Việc tìm kiếm và chuyển đổi nên được phân biệt chữ hoa chữ thường.

Trước hết tôi đã thử,

sed 's/the/this/'

nhưng trong trường hợp thử nghiệm mẫu đó đã thất bại. Sau đó tôi đã thử

sed 's/the /this /'

va no đa hoạt động. Vì vậy, câu hỏi đặt ra sự khác biệt nào đã tạo ra khoảng trắng? Am i thiếu cái gì ở đây?


Tôi giả sử phiên bản đầu tiên cũng "hoạt động", nhưng không như bạn mong đợi. Đáng lẽ nó phải thay thế lần xuất hiện đầu tiên của chuỗi chữ cái "the", nhưng có lẽ bạn đã xem sự xuất hiện đầu tiên của từ "the".
Dubu

Vâng, trong này, có, trong thực tế, không.
Rolf

Câu trả lời:


7

Sự khác biệt là liệu có một khoảng trắng sau thetrong văn bản đầu vào hay không.
Ví dụ:

Với một câu không có dấu cách , không thay thế:

$ echo 'theman' | sed 's/the /this /'
theman

Với một câu có khoảng trắng , hoạt động như mong đợi:

$ echo 'the man' | sed 's/the /this /'
this man

Với một câu với một ký tự khoảng trắng khác , sẽ không có sự thay thế nào xảy ra:

$ echo -e 'the\tman' | sed 's/the /this /'
the     man

Tôi đã bỏ lỡ nó. Tôi đã phải lấy "the" làm một chuỗi. Không phải là một chuỗi con.
JHA

1
@JHA: Nó cũng quan trọng ở cuối dòng. ví dụ: từ "the" có thể xuất hiện ở cuối dòng như một phần của tệp có ngắt dòng, nhưng vẫn ở giữa đoạn và do đó vẫn là một từ bình thường trong câu tiếng Anh. the( |$)có thể gần hơn để làm việc, nếu regex mở rộng đó hoạt động. Dù sao, IDK những gì bạn có nghĩa là "như một chuỗi" so với chuỗi con. Trong cả hai trường hợp, đó là một chuỗi con của toàn bộ dòng và các testcase của bạn không đủ để phát hiện các trường hợp "the "không thành công. Câu trả lời của Kusalanada tốt hơn đáng kể, tôi khuyên bạn nên chấp nhận nó.
Peter Cordes

20

Đó là một cách rẻ tiền và dễ bị lỗi khi thực hiện so khớp từ .

Lưu ý rằng thevới một khoảng trắng sau từ không khớp với từ đó thereby, do đó, khớp với khoảng thetrắng sau khi tránh khớp chuỗi đó khi bắt đầu từ. Tuy nhiên, nó vẫn không phù hợp bathe(nếu theo sau là một khoảng trống), và nó không phù hợp theở phần cuối của một đường thẳng.

Để khớp từ theđúng (hoặc bất kỳ từ nào khác), bạn không nên sử dụng khoảng trắng xung quanh từ đó, vì điều đó sẽ ngăn bạn khớp từ đó ở đầu hoặc cuối dòng hoặc nếu nó bị bỏ qua bởi bất kỳ ký tự không phải từ nào khác, chẳng hạn như bất kỳ dấu chấm câu hoặc ký tự tab, ví dụ.

Thay vào đó, sử dụng mẫu ranh giới từ có độ rộng bằng không:

sed 's/\<the\>/this/'

Các \<\>phù hợp với ranh giới trước và sau khi văn bản, tức là khoảng cách giữa một nhân vật từ và một nhân vật phi-word . Một ký tự từ nói chung là bất kỳ ký tự khớp nào [[:alnum:]_](hoặc [A-Za-z0-9_]trong miền địa phương POSIX).

Với GNU sed, bạn cũng có thể sử dụng \bthay thế \<\>:

sed 's/\bthe\b/this/'

7

sed làm việc với các biểu thức thông thường. Sử dụng sed 's/the /this /'bạn chỉ cần tạo khoảng trống sau themột phần của mẫu phù hợp.

Sử dụng sed 's/the/this/'bạn thay thế tất cả các lần xuất hiện thethiskhông có vấn đề nếu một không gian tồn tại sau the.

Trong bài tập HackerRank, kết quả là như nhau bởi vì để thay thế bằng điều này là hợp lý ... bạn chỉ thay thế một danh từ mà theo mặc định được theo sau bởi khoảng trắng (quy tắc ngữ pháp).

Bạn có thể thấy sự khác biệt nếu bạn thử lấy ví dụ để viết hoa thetrong từ the theater:

echo 'the theater' |sed 's/the /THE /g'
THE theater                              
#theater is ignored since the is not followed by space

echo 'the theater' |sed 's/the/THE/g'
THE THEater
#both the are capitalized.

Cảm ơn bạn đã trả lời. Đánh giá cao :)
JHA

"Bạn thay thế tất cả các lần xuất hiện" Để rõ ràng: Không có gvăn bản thay thế sau, bạn chỉ thay thế lần xuất hiện đầu tiên .
Dubu
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.