Làm cách nào để thêm văn bản vào cuối dòng khi mẫu được khớp?


8

đầu vào:

line1 with the PATTERN that contains ( ) 
line2 with the PATTERN that contains ( ) 
lineN with the PATTERN that contains ( ) 

đầu ra:

line1 with the PATTERN that contains ( ) ;
line2 with the PATTERN that contains ( ) ;
...
lineN with the PATTERN that contains ( ) ;

Tôi đã thử điều này:

find . -name "test.txt" -print | xargs sed -i "/PATTERN/ s/$)/); /g"

nhưng nó không hoạt động.

Câu trả lời:


3
perl -ipe 's/$/;/ if /PATTERN/'

Điều này sẽ thêm một ;ở cuối nếu dòng chứa PATTERN.


3

Các $kết quả khớp với cuối dòng, vì vậy mẫu của bạn nên )$thay vì $)giống như trong ví dụ của bạn.

Ngoài ra, bạn không cần xargsở đây, an toàn hơn khi sử dụng -execcờ của fine:

find . -name test.txt -exec sed -i '/PATTERN/ s/)$/); /' '{}' +

Nếu +cuối cùng phiên bản tìm kiếm của bạn không hoạt động , thì hãy sử dụng \;thay thế (cảm ơn bạn @ glenn-jackman ):

find . -name test.txt -exec sed -i '/PATTERN/ s/)$/); /' '{}' \;

Cuối cùng, không cần gcờ trong s/something$//thành ngữ, vì chỉ có một lần xuất hiện của $mỗi dòng.


1
Bạn sẽ đạt được một số hiệu quả với -exec ... +thay vì -exec ... \;, nếu tìm thấy của bạn cho phép nó.
— glenn jackman

2

Giả sử đó PATTERNlà thực tế ( )và một cái gì đó có thể đi vào giữa ( )và rằng chúng không nhất thiết phải ở cuối dòng:

sed -i '/(.*)/ s/$/ ;/' test.txt

1

Sử dụng ex(tương đương với vi -e/ vim -e).

Một tập tin:

ex +"g/local/s/$/;/g" -cwq foo.txt

Tất cả test.txtcác tệp đệ quy:

ex +"bufdo g/local/s/$/;/g" -cxa **/test.txt

Lưu ý: Đảm bảo rằng tùy chọn toàn cầu ( **) được bật bằng cách: shopt -s globstarnếu trình bao của bạn hỗ trợ nó.

Lưu ý: :bufdoLệnh không phải là POSIX .



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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.