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