Sed thay thế thông qua một câu trên nhiều dòng


11

Tôi mới sử dụng sed nhưng tôi đã thử nghiệm sed s/..../..../(thay thế) để sửa đổi một câu đầy đủ nếu nó trên một dòng nhưng tôi không biết một giải pháp thay thế nào về cách sửa đổi một câu có thể được tách ra trên hai dòng như:

Điều này:

Lorem Ipsum is simply dummy text of the printing and typesetting industry.

thực sự được viết như thế này:

Lorem Ipsum is simply dummy text of the 
printing and typesetting industry.

Làm thế nào bạn có thể phát hiện ra điều này hoặc mã nó để thay thế toàn bộ câu ngay cả khi nó nằm trên hai dòng thay vì một dòng?


Cuốn sách tham khảo tuyệt vời về sed: Hướng dẫn dứt khoát về sed Hướng dẫn và tham khảo của Daniel A. Goldman ISBN: 980-1-939824-01-1 (phiên bản EPUB) 08148804441822
Joe

Câu trả lời:


16

Lệnh sau sẽ hoạt động trong cả hai tình huống:

sed '/Lorem.*/ {N; s/Lorem.*industry\./string to replace/g}' filename

Giải thích thêm: Làm thế nào tôi có thể sử dụng sed để thay thế một chuỗi nhiều dòng?


3
@Gilles Tôi hiểu ý tốt của bạn, nhưng vui lòng thử kiểm tra trước để làm hỏng câu trả lời của tôi. Tốt hơn, nếu bạn có ý kiến ​​khác, là thêm một câu trả lời khác hoặc để lại nhận xét.
Radu Rădeanu

Chào mừng bạn đến với Stack Exchange. Trang web này được cộng tác chỉnh sửa. Nếu bạn không hài lòng với ý tưởng về những đóng góp của mình được cộng tác bởi những người dùng đáng tin cậy khác, đây có thể không phải là trang web dành cho bạn. Tôi nhận thấy rằng mã của bạn đã thay thế nhiều hơn cụm từ cụ thể đã được dự định, vì vậy tôi đã chỉnh sửa cụm từ đó.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Xin vui lòng, bạn không cần phải tinh nghịch. Bạn cũng nên lưu ý rằng "mã" của bạn thay thế hoàn toàn không có gì . Như tôi đã nói, tôi hiểu ý tốt của bạn. Từ ví dụ của tôi, tôi cho rằng OP hiểu cách thay thế thông qua một câu trên nhiều dòng sed, không có gì hơn. Và đây là câu hỏi tiêu đề. Tiêu đề không phải là về perl.
Radu Rădeanu

Không, mã tôi đã đăng không hoạt động. (Trừ khi Loremlà trên dòng cuối cùng, một khiếm khuyết đó chia sẻ với phiên bản của bạn.)
Gilles 'Somali dừng vốn là xấu'

Ví dụ này không hoạt động khi có từ 3 dòng văn bản trở lên :(
artnikpro

12

Mặc dù sed có thể khớp các mẫu trên nhiều dòng (sử dụng các lệnh Nhoặc Hnối thêm các dòng liên tiếp trước khi khớp), nhưng điều này nằm ngoài vùng thoải mái của nó. Cố gắng chỉ khi bạn thích đau.

Perl có thể làm những điều này độc đáo. Sử dụng công -ptắc để làm cho nó xử lý một bản ghi đầu vào tiêu chuẩn tại một thời điểm và in bản ghi đã sửa đổi (à la sed) và -000để bật chế độ đoạn văn (trong đó các bản ghi được phân tách bằng các dòng trống). Trong một biểu thức chính quy, \skhớp với bất kỳ ký tự khoảng trắng nào kể cả dòng mới.

perl -p -000 -e 's/Lorem\s+Ipsum\s+is\s+simply\s+dummy\s+text\s+of\s+the\s+printing\s+and\s+typesetting\s+industry\./Replacement text/g'

Nếu bạn muốn đặt một dòng mới trong văn bản thay thế khi bản gốc chứa một dòng, điều đó phức tạp hơn. Làm thế nào để làm điều đó phụ thuộc vào yêu cầu của bạn là nơi để đặt dòng mới.


@terdon À, ý tôi là cho phép nhiều khoảng trắng nhưng quên mất. Cảm ơn, đã sửa.
Gilles 'SO- ngừng trở nên xấu xa'

Câu hỏi là về sed. Nó cũng được gắn thẻ sed, không phải với perl.
Radu Rădeanu

0

sed không thể dễ dàng đọc qua nhiều dòng. Sử dụng perl -i -0pe 's/.../.../...'thay thế.


7
sed có thể đọc qua nhiều dòng!
Radu Rădeanu

3
@ RaduRădeanu Về mặt kỹ thuật, vâng. Nhưng nó hiếm khi gây rắc rối.
Gilles 'SO- ngừng trở nên xấu xa'

3
@Gilles Nếu việc sử dụng perlđơn giản hơn đối với bạn, điều này không có nghĩa là sedhiếm khi gây rắc rối.
Radu Rădeanu
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.