เพิ่มข้อความที่ส่วนท้ายของแต่ละบรรทัด


93

ฉันใช้บรรทัดคำสั่ง Linux และฉันมีไฟล์

127.0.0.1
128.0.0.0
121.121.33.111

ฉันต้องการ

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

ฉันจำได้ว่าเพื่อนร่วมงานของฉันใช้ sed สำหรับสิ่งนั้น แต่หลังจากอ่านคู่มือ sed ก็ยังไม่ชัดเจนว่าจะทำอย่างไรในบรรทัดคำสั่ง?


2
คำถามที่ดีและฉันชอบที่คุณวางกรอบไว้
Anthony Rutledge

คำตอบ:


142

คุณสามารถลองใช้สิ่งต่างๆเช่น:

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

โดยที่รูปแบบไฟล์ของคุณเป็นไปตามที่คุณได้อธิบายไว้ในคำถามของคุณ

s///ตรงกับคำสั่งเปลี่ยนตัว ( พบ ) ในตอนท้ายของแต่ละบรรทัดในไฟล์ของคุณ (ใช้ที่$ตัวอักษร) แล้วผนวก ( แทนที่ ) เดอะ:80ถึงจุดสิ้นสุดของแต่ละบรรทัด ips.txtไฟล์แฟ้มใส่ของคุณ ... และnew-ips.txtเป็นไฟล์ที่สร้างขึ้นใหม่ของคุณ ( ผลสุดท้ายของการเปลี่ยนแปลงของคุณ. )


นอกจากนี้หากคุณมีรายการหมายเลข IP ที่มีหมายเลขพอร์ตแนบอยู่แล้ว (ตามที่Vladระบุไว้และตามที่aragaerระบุ) คุณสามารถลองใช้สิ่งต่อไปนี้:

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

ตัวอย่างเช่นหากไฟล์อินพุตของคุณมีลักษณะดังนี้(สังเกต:80) :

127.0.0.1
128.0.0.0:80
121.121.33.111

ผลลัพธ์สุดท้ายจะมีลักษณะดังนี้:

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

1
ตกลงแค่ชี้แจง ... อาจจะมีเงื่อนไขในการยกเว้นบรรทัดที่มีพอร์ตอยู่แล้ว
Vlad

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

3
เพิ่มคำตอบของคุณเอง คำแนะนำในการยกเว้นบรรทัดที่มีพอร์ตมีอยู่แล้วในความคิดเห็นฉันเพิ่งเขียนคำสั่งที่แน่นอน
aragaer

3
หากไฟล์มีเทอร์มิเนเตอร์ CRLF ไฟล์:80จะถูกเพิ่มที่จุดเริ่มต้นของบรรทัดต่อไปนี้ ใช้dos2unixกับไฟล์ก่อนหากจำเป็น
djnz0feh

1
เป็น-nสิ่งที่จำเป็น? อาจไม่ใช่สำหรับผู้ใช้ส่วนใหญ่
jimh

17

คำสั่งsedเวอร์ชันกระชับ:

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

คำอธิบาย:

  • sed s tream ed itor
    • -i i n-place (แก้ไขไฟล์ในสถานที่)
    • s sคำสั่ง ubstitution
    • /replacement_from_reg_exp/replacement_to_text/ คำให้การ
    • $ตรงกับท้ายบรรทัด ( replacement_from_reg_exp )
    • :80ข้อความที่คุณต้องการเพิ่มในตอนท้ายของทุกบรรทัด ( replacement_to_text )
  • file.txt ชื่อไฟล์


12

หากคุณต้องการเพิ่มข้อความที่ส่วนท้ายของแต่ละบรรทัดในตำแหน่ง (ในไฟล์เดียวกัน) คุณสามารถใช้-iพารามิเตอร์ตัวอย่างเช่น:

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

อย่างไรก็ตาม-iตัวเลือกนี้เป็นส่วนขยาย Unix ที่ไม่ได้มาตรฐานและอาจไม่มีในระบบปฏิบัติการทั้งหมด

ดังนั้นคุณสามารถพิจารณาใช้ex(ซึ่งเทียบเท่ากับvi -e/ vim -e):

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

ซึ่งจะเพิ่ม:80ในแต่ละบรรทัด แต่บางครั้งก็สามารถต่อท้ายเป็นบรรทัดว่างได้

วิธีที่ดีกว่าคือตรวจสอบว่าบรรทัดนั้นมีตัวเลขจริงหรือไม่จากนั้นต่อท้ายเช่น:

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

ถ้าไฟล์ที่มีรูปแบบที่ซับซ้อนมากขึ้นพิจารณาใช้ regex [0-9]ที่เหมาะสมแทน


1

ใช้โปรแกรมแก้ไขข้อความตรวจสอบ^M(control-M หรือ carriage return) ที่ท้ายแต่ละบรรทัด คุณจะต้องลบออกก่อนจากนั้นต่อท้ายข้อความเพิ่มเติมที่ท้ายบรรทัด

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

0
  1. คุณยังสามารถบรรลุสิ่งนี้ได้โดยใช้เทคนิค backreference

    sed -i.bak 's/\(.*\)/\1:80/' foo.txt
    
  2. คุณยังสามารถใช้กับ awk แบบนี้ได้

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

-1

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

ฉันทำสิ่งนี้บ่อยครั้งเพื่อเพิ่มเครื่องหมายจุลภาคที่ส่วนท้ายของผลลัพธ์เพื่อให้ฉันสามารถคัดลอกและวางลงในอาร์เรย์ Python (หรือภาษาที่คุณชื่นชอบ) ได้อย่างง่ายดาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.