sed - làm thế nào để sử dụng \ b ranh giới từ chính xác?


10

Tôi muốn thay thế các trích dẫn ở đầu một từ.

Ví dụ:

$ echo "a 'line' a single ' after a  'keyword' with a few space's for a program"\
| sed "s/\b'/X/g"
a 'lineX a single ' after a  'keywordX with a few spaceXs for a program

nhưng như bạn có thể thấy chúng đang được thay thế ở cuối các từ không phải là bắt đầu.
Làm thế nào để thay thế những từ bắt đầu một từ?

Câu trả lời:


11

Điều này thay thế 'ở đầu từ:

$ echo "a 'line' a single ' after a  'keyword' with a few space's for a program"| sed "s/'\b/X/g"
a Xline' a single ' after a  Xkeyword' with a few spaceXs for a program

Đối với con người, không phải máy tính, có một điểm đặc biệt ở đây: máy tính được tính space'slà hai từ và thay thế 'bởi vì nó nằm ở đầu từ thứ hai.

Thảo luận

\bđánh dấu một ranh giới từ, bắt đầu hoặc kết thúc. Bây giờ hãy xem xét \b'. Điều này phù hợp với một ranh giới từ theo sau a '. Kể từ khi 'không một nhân vật văn bản, điều này có nghĩa rằng việc chấm dứt từ phải đứng trước 'để phù hợp. Để sử dụng \bđể khớp với lúc bắt đầu của từ, đảo ngược thứ tự : '\b. Một lần nữa, vì 'không phải là một ký tự từ, nên điều này sẽ chỉ khớp nếu một từ theo sau '.

Một số sed, như GNU sed, hỗ trợ \<để bắt đầu từ. Điều này không giúp ích gì trong trường hợp của bạn vì 'đã không phải là một ký tự từ và điều đó buộc vấn đề.

Phải làm gì về "không gian"

Nếu bạn không muốn 'thay thế space'sbởi vì 'xuất hiện ở cuối từ, bạn có thể đảo ngược logic bằng cách sử dụng \B:

$ echo "a 'line' a single ' after a  'keyword' with a few space's for a program"| sed "s/\B'/X/g"
a Xline' a single X after a  Xkeyword' with a few space's for a program

\Bkhông khớp với một ranh giới từ . Do đó, \B'khớp với '(không gian trích dẫn) bởi vì không gian cũng như trích dẫn không phải là ký tự từ. Nó không khớp space'bởi vì e'là một ranh giới từ: elà một ký tự từ và 'không.

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.