Thay thế sự xuất hiện đầu tiên của một mẫu trong một dòng, cho tất cả các dòng trong một tệp có sed


16

Có thể làm điều đó trong một lót?

Tôi có một đầu ra như thế này:

"First line" - Description  
" Second line" - Description  
"Third line" - Description  
" Fourth line" - Description  

Đầu vào này được tạo tự động.

Tôi muốn thay thế lần xuất hiện đầu tiên của "(dấu ngoặc kép + dấu cách) bằng "(dấu ngoặc kép) cho mỗi dòng. Nếu tôi áp dụng sự thay thế trên toàn cầu, nó cũng sẽ thay đổi mỗi lần xuất hiện của line" -để line"-, vì vậy tôi đã tự hỏi nếu nó có thể sử dụng một sed lót để thực hiện điều này.

Tôi đã thử sử dụng ^như thế này

sed -r ':a;N;$!ba;s/(\^\" )/\"/g'

Nhưng nó không hoạt động, nó không thay thế bất cứ điều gì. Tôi đã thử

sed -r ':a;N;$!ba;s/(^|\" )/\"/g'

và nó thay thế tất cả các lần xuất hiện. Tôi mới bắt đầu sử dụng sed, vì vậy tôi thực sự không biết liệu mình có làm gì sai không.

Tôi đang thiếu gì ở đây?


Lưu ý về nhãn: Lệnh bạn đã viết ở trên có thể hoạt động trong một số triển khai sed, nhưng để có tính di động và để tránh các lỗi thực sự lạ, bạn nên kết thúc một đối số lệnh đã cho sau nhãn (nếu bạn cần chúng). Ví dụ:sed -e ':a' -e 'N;$!ba' -e 'whatever'
Wildcard

Câu trả lời:


34

Bạn đang xem xét nó. sedTheo mặc định, chỉ thay thế phiên bản đầu tiên trên một dòng (không có công cụ /gsửa đổi), mặc dù bạn vẫn muốn neo vì bạn không muốn phiên bản đầu tiên trong dòng là phiên bản đầu tiên của dòng; và bạn thường không cần các hành động rõ ràng mà bạn đang cố gắng sử dụng (tại sao?).

sed 's/^" /"/'

Cảm ơn! Tôi nghĩ rằng cần phải khai báo rõ ràng các hành động dòng khi làm việc trên một tệp, đọc về nó và tiếp tục sử dụng chúng. Tôi thực sự đã suy nghĩ quá mức, điều đó không thể đơn giản hơn và nó thực hiện được mánh khóe :)
Steve B.

Tôi muốn nói rằng những lệnh đó đã khá lỗi thời; có thể thực hiện những điều đa hướng khá phức tạp với chúng, nhưng không dễ để làm điều đó và ngày nay bạn thực sự tốt hơn khi sử dụng perl / python / ruby ​​/ bất cứ điều gì thay thế.
geekizard

Hoàn toàn không đồng ý với nhận xét trên; sedcác lệnh nhiều dòng như Nvà các nhãn như hoàn toàn :akhông lỗi thời và chúng có thể di động và POSIX được chỉ định , không giống như Perl / Python / Ruby / bất cứ thứ gì. Tuy nhiên, đúng là nếu bạn thấy mình cần chúng thường xuyên, bạn nên học hỏiawk .
tự đại diện

2

Một câu trả lời tổng quát hơn, vì tôi không thể nhận xét về câu trả lời của geekizard - Bạn sẽ không đặt ^ (bắt đầu neo dòng). Ví dụ: nếu bạn muốn thay thế lần xuất hiện đầu tiên của A bằng B, bạn sẽ có

sed 's/A/B/'
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.