Thêm văn bản vào cuối mỗi dòng


90

Tôi đang sử dụng dòng lệnh Linux và tôi có tệp với

127.0.0.1
128.0.0.0
121.121.33.111

tôi muốn

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

Tôi nhớ các đồng nghiệp của tôi đã sử dụng sed cho điều đó, nhưng sau khi đọc hướng dẫn sử dụng sed vẫn không rõ làm thế nào để làm điều đó trên dòng lệnh?


1
Câu hỏi hay và tôi thích cách bạn đóng khung nó.
Anthony Rutledge

Câu trả lời:


139

Bạn có thể thử sử dụng một cái gì đó như:

sed -n 's/$/:80/' ips.txt > new-ips.txt

Với điều kiện là định dạng tệp của bạn giống như bạn đã mô tả trong câu hỏi của mình.

Lệnh s///thay thế khớp ( tìm ) phần cuối của mỗi dòng trong tệp của bạn (sử dụng $ký tự) và sau đó nối ( thay thế ) :80vào cuối mỗi dòng. Các ips.txttập tin là tập tin đầu vào của bạn ... và new-ips.txtlà tập tin mới tạo ( kết quả cuối cùng của những thay đổi của bạn. )


Ngoài ra, nếu bạn có một danh sách các số IP có số cổng đã được đính kèm, (theo ghi nhận của Vlad và do aragaer đưa ra ), bạn có thể thử sử dụng một cái gì đó như:

sed '/:[0-9]*$/ ! s/$/:80/' ips.txt > new-ips.txt

Vì vậy, ví dụ, nếu tệp đầu vào của bạn trông giống như thế này (lưu ý :80) :

127.0.0.1
128.0.0.0:80
121.121.33.111

Kết quả cuối cùng sẽ giống như sau:

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

@Vlad Có; nhưng theo đầu vào ví dụ OPs đã cho ... không nên có bất kỳ số cổng nào trong danh sách IP. :) Ngay cả khi có ... OP vẫn có thể chạy s///trước một sed khác để lấy ra bất kỳ số cổng nào ở cuối mỗi dòng.
summea

1
Ok, chỉ cần làm rõ ... Có lẽ nên có một điều kiện để loại trừ các dòng có cổng đã tồn tại.
Vlad

3
sed '/:[0-9]*$/ ! s/$/:80/'
aragaer

3
Thêm nó vào câu trả lời của riêng bạn. Đề xuất loại trừ các dòng có cổng đã có ở đây trong phần nhận xét, tôi chỉ viết lệnh chính xác.
aragaer

2
Nếu tệp có các dấu cuối CRLF, thì :80sẽ được thêm vào đầu dòng sau. Sử dụng dos2unixtrên tệp trước nếu cần thiết.
djnz0feh 20/02/18

12

Nếu bạn muốn thêm văn bản vào cuối mỗi dòng tại chỗ (trong cùng một tệp), bạn có thể sử dụng -itham số, ví dụ:

sed -i'.bak' 's/$/:80/' foo.txt

Tuy nhiên, -itùy chọn này là phần mở rộng Unix không chuẩn và có thể không khả dụng trên tất cả các hệ điều hành.

Vì vậy, bạn có thể cân nhắc sử dụng ex(tương đương với vi -e/ vim -e):

ex +"%s/$/:80/g" -cwq foo.txt

sẽ thêm :80vào mỗi dòng, nhưng đôi khi nó có thể thêm vào các dòng trống.

Vì vậy, phương pháp tốt hơn là kiểm tra xem dòng có thực sự chứa bất kỳ số nào không và sau đó nối nó vào, ví dụ:

ex  +"g/[0-9]/s/$/:80/g" -cwq foo.txt

Nếu tệp có định dạng phức tạp hơn, hãy xem xét sử dụng regex thích hợp, thay vì [0-9].


12

Phiên bản ngắn gọn của lệnh sed :

sed -i s/$/:80/ file.txt

Giải trình:

  • sed s tream ed itor
    • -i i n-place (chỉnh sửa tệp tại chỗ)
    • s s lệnh ubstitution
    • /replacement_from_reg_exp/replacement_to_text/ tuyên bố
    • $khớp với cuối dòng ( Replace_from_reg_exp )
    • :80văn bản bạn muốn thêm vào cuối mỗi dòng ( Replace_to_text )
  • file.txt tên tập tin


0

Sử dụng trình soạn thảo văn bản, hãy kiểm tra ^M(control-M hoặc ký tự xuống dòng) ở cuối mỗi dòng. Trước tiên, bạn cần phải xóa chúng, sau đó nối văn bản bổ sung vào cuối dòng.

sed -i 's|^M||g' ips.txt
sed -i 's|$|:80|g' ips.txt

0
  1. Bạn cũng có thể đạt được điều này bằng cách sử dụng kỹ thuật phản hồi

    sed -i.bak 's/\(.*\)/\1:80/' foo.txt
    
  2. Bạn cũng có thể sử dụng với awk như thế này

    awk '{print $0":80"}' foo.txt > tmp && mv tmp foo.txt
    

-1

sed -i 's / $ /, / g' foo.txt

Tôi làm điều này khá thường xuyên để thêm dấu phẩy vào cuối đầu ra để tôi có thể dễ dàng sao chép và dán nó vào mảng Python (hoặc ngôn ngữ yêu thích của bạ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.