thay thế lần xuất hiện thứ n của chuỗi trong mỗi dòng của tệp văn bản


15

Tôi có các tệp văn bản lớn với các chuỗi phân cách không gian (2-5). Các chuỗi có thể chứa "'" hoặc "-". Tôi muốn thay thế không gian thứ hai bằng một đường ống.

Cách tốt nhất để đi là gì?

Sử dụng sed tôi đã nghĩ về điều này:

sed -r 's/(^[a-z'-]+ [a-z'-]+\b) /\1|/' filename.txt

Bất kỳ ý tưởng khác / tốt hơn / đơn giản hơn?

Câu trả lời:


22

Bạn có thể thêm một số ở cuối lệnh thay thế. Ví dụ: phần sau đây sẽ thay thế lần xuất hiện thứ hai oldbằng chuỗi newtrên mỗi dòng file:

sed 's/old/new/2' file

Vì vậy, thay vì giải pháp đề xuất của bạn, bạn có thể sử dụng:

sed 's/ /|/2'

Để biết thêm thông tin, xem ví dụ hướng dẫn sed này .


2
Từ sedtệp thông tin: "Lưu ý: tiêu chuẩn POSIX không chỉ định điều gì sẽ xảy ra khi bạn trộn các g' and NUMBER modifiers, and currently there is no widely agreed upon meaning across triển khai của sed '. Đối với GNU` sed', tương tác được xác định là: bỏ qua các kết quả khớp trước SỐ, rồi khớp và thay thế tất cả phù hợp từ thứ 1 trở đi. "
Tạm dừng cho đến khi có thông báo mới.

Thông tin tập tin ... Tôi ghét chúng. Dù sao, tôi đã loại bỏ phần mơ hồ. Nhận xét tốt, +1.
mrucci

1
Cảm ơn, mrucci và Dennis. Tôi nghĩ rằng phải có một cái gì đó đơn giản ngoài kia.
dnkb

Dường như mọi vấn đề tôi gặp phải với thao tác văn bản, tôi quản lý để giải quyết sed. Tôi không chắc là tôi nên cảm ơn bạn vì đã làm sedcho tôi hữu ích hơn nữa, nhưng dù sao thì tôi cũng sẽ như vậy. ;)
Jamie

1

Bạn đã thử phiên bản của bạn? Nó có hoạt động không? Bởi vì tôi nghĩ rằng nó về cơ bản là một ý tưởng tốt. Tôi sẽ làm hơi khác một chút, mặc dù:

sed -re 's/^([^ ]+ +[^ ]+) /\1|/'

Điều này sẽ chấp nhận bất kỳ ký tự nào trong một từ không phải là khoảng trắng và sẽ chấp nhận nhiều hơn một khoảng trắng giữa hai từ đầu tiên.

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.