คำถามติดแท็ก sed

sed เป็นตัวแก้ไขสตรีมบรรทัดคำสั่งสำหรับการกรองและแปลงข้อความ


7
Sed - แทนที่อินสแตนซ์ k แรกของคำในไฟล์
ฉันต้องการแทนที่kอินสแตนซ์แรกของคำ ฉันจะทำสิ่งนี้ได้อย่างไร เช่น. ไฟล์ Say foo.txtมี 100 อินสแตนซ์ของคำว่า 'linux' ฉันต้องแทนที่ 50 รายการแรกเท่านั้น

3
แตกต่างแสดงบรรทัดที่แก้ไขจากไฟล์ที่ถูกต้องเท่านั้น
ฉันมีไฟล์aและbและผมอยากจะสายออกของที่มีการเปลี่ยนแปลงตั้งแต่มันถูกโคลนจากb aเพียงแค่บรรทัดที่แก้ไขไม่มีบริบทโดยรอบไม่มีเครื่องหมายตรงข้ามที่ต่างกัน ฉันจะทำสิ่งนั้นโดยใช้เชลล์สคริปต์ได้อย่างไร (ไม่มี Python / Perl / PHP / ... ) Sed และ awk เป็นคำตอบที่ยอมรับได้ สำหรับตอนนี้สิ่งที่ฉันกำลังทำคือ diff -y กับ - suppress-common-lines และ sed โดยใช้การอ้างอิงย้อนกลับของ regex เพื่อดึงส่วนที่ถูกต้องหลังจากช่องว่าง จะต้องมีวิธีที่ดีกว่า ใช้ perl (ซึ่งเป็นสิ่งต้องห้าม) ฉันจะทำสิ่งนี้: diff -y --suppress-common-lines -W $COLUMNS Eclipse_Preferences_Export_*.epf | perl -pe 's/.*\t|\t(.*)$/\1/g'
24 shell-script  sed  awk  diff 

4
sed ด้วยการแสดงออกหลายสำหรับการโต้แย้งในสถานที่
ฉันพยายามแทนที่คำหลายคำในไฟล์โดยใช้ sed -i #expression1 #expression2 ไฟล์ Something 123 item1 Something 456 item2 Something 768 item3 Something 353 item4 เอาท์พุท (ที่ต้องการ) anything 123 stuff1 anything 456 stuff2 anything 768 stuff3 anything 353 stuff4 ลองลึกหนาบาง ฉันจะได้รับผลลัพธ์ต่อไปนี้โดยใช้sed -i2 ครั้ง sed -i 's/Some/any/g' file sed -i 's/item/stuff/g' file ฉันสามารถมีวิธีที่เป็นไปได้ในการทำให้สิ่งนี้เป็นคำสั่งแบบแทนที่เดียวได้ไหม sed -i 's/Some/any/g' -i 's/item/stuff/g' …


5
วิธีรายงานการเปลี่ยนแปลงแบบ "sed" ในสถานที่
เมื่อใช้sedเพื่อแทนที่สตริงในสถานที่มีวิธีที่จะรายงานการเปลี่ยนแปลงที่เกิดขึ้น (โดยไม่ต้องอาศัยความแตกต่างของไฟล์เก่าและใหม่)? ตัวอย่างเช่นฉันจะเปลี่ยนบรรทัดคำสั่งได้อย่างไร find . -type f | xargs sed -i 's/abc/def/g' ดังนั้นฉันสามารถเห็นการเปลี่ยนแปลงที่เกิดขึ้นทันที?

7
ข้อความระหว่างสองแท็ก
ฉันต้องการดึงสิ่งที่อยู่ระหว่างแท็กสองแท็กเหล่านี้<tr> </tr>- จากเอกสาร html ตอนนี้ฉันไม่มีข้อกำหนด html เฉพาะใด ๆ ที่จะรับประกันการแยกวิเคราะห์ html ฉันเพียงแค่ต้องการสิ่งธรรมดาที่การแข่งขัน<tr>และ</tr>และได้รับทุกอย่างในระหว่างและอาจจะมีหลายtrs ฉันลอง awk ซึ่งใช้งานได้ แต่ด้วยเหตุผลบางอย่างมันทำให้ฉันซ้ำซ้อนของแต่ละแถวที่แยกออกมา awk ' /<TR/{p=1; s=$0} p && /<\/TR>/{print $0 FS s; s=""; p=0} p' htmlfile> newfile จะไปเกี่ยวกับเรื่องนี้ได้อย่างไร

5
วิธีจัดการไฟล์ CSV ด้วย sed หรือ awk?
ฉันจะทำสิ่งต่อไปนี้กับไฟล์ CSV โดยใช้sedหรือawk? ลบคอลัมน์ ทำซ้ำคอลัมน์ ย้ายคอลัมน์ ฉันมีโต๊ะใหญ่กว่า 200 sedแถวและฉันไม่ว่าคุ้นเคยกับ
23 sed  awk  csv 

7
ลบเครื่องหมายจุลภาคระหว่างเครื่องหมายคำพูดเฉพาะในไฟล์ที่คั่นด้วยเครื่องหมายจุลภาค
ฉันมีไฟล์อินพุตคั่นด้วยเครื่องหมายจุลภาค ( ,) มีบางฟิลด์อยู่ในเครื่องหมายคำพูดคู่ที่มีเครื่องหมายจุลภาคอยู่ นี่คือแถวตัวอย่าง 123,"ABC, DEV 23",345,534.202,NAME ฉันต้องลบเครื่องหมายจุลภาคทั้งหมดที่เกิดขึ้นภายในเครื่องหมายคำพูดคู่และเครื่องหมายคำพูดคู่ด้วย ดังนั้นบรรทัดข้างต้นควรได้รับการแยกวิเคราะห์ตามที่แสดงด้านล่าง 123,ABC DEV 23,345,534.202,NAME ฉันลองใช้สิ่งต่อไปนี้sedแต่ไม่ให้ผลลัพธ์ที่คาดหวัง sed -e 's/\(".*\),\(".*\)/\1 \2/g' เทคนิคใด ๆ อย่างรวดเร็วด้วยsed, awkหรือยูทิลิตี้ยูนิกซ์อื่นใดโปรด?
23 text-processing  sed  awk  csv 

3
แทนที่สตริงด้วยเนื้อหาของไฟล์โดยใช้ sed
ฉันมีสองไฟล์ที่แตกต่างกัน: file1 /home/user1/ /home/user2/bin /home/user1/a/b/c file2 <TEXT1> <TEXT2> ฉันต้องการที่จะเข้ามาแทนที่<TEXT1>ของFile2กับเนื้อหาของFile1sedใช้ ฉันลองคำสั่งนี้ แต่ไม่ได้ผลลัพธ์ที่เหมาะสม: cat File2|sed "s/<TEXT1>/$(cat File1|sed 's/\//\\\//g'|sed 's/$/\\n/g'|tr -d "\n")/g" คุณสามารถใช้เครื่องมืออื่นเพื่อแก้ไขปัญหานี้ได้เช่นกัน
23 sed  replace 

8
ใช้ sed เพื่อแปลงบรรทัดใหม่เป็นช่องว่าง
ว่าฉันมีตัวแปรเชลล์$stringที่เก็บข้อความที่มีบรรทัดใหม่หลายบรรทัดเช่น: string="this is a test" ฉันต้องการแปลงสตริงนี้เป็นสตริงใหม่new_stringที่การแบ่งบรรทัดทั้งหมดถูกแปลงเป็นช่องว่าง: new_string="this is a test" ฉันเหนื่อย: print $string | sed 's/\n/ /g' แต่มันไม่ทำงาน ฉันยังสงสัยว่ามีวิธีการทำเช่นนี้โดยใช้ perl -0777 's/\n/ /g'หรืออาจคำสั่งtr?
22 shell  sed 

4
sed - แทนที่สตริงด้วยเนื้อหาไฟล์
ฉันมีสองไฟล์: และfile1file2 file1 มีเนื้อหาดังต่อไปนี้: --- host: "localhost" port: 3000 reporter_type: "zookeeper" zk_hosts: - "localhost:2181" file2มีที่อยู่ IP ( 1.1.1.1) สิ่งที่ฉันต้องการจะทำคือแทนที่localhostด้วย1.1.1.1ผลลัพธ์ก็คือ: --- host: "1.1.1.1" port: 3000 reporter_type: "zookeeper" zk_hosts: - "1.1.1.1:2181" ฉันเหนื่อย: sed -i -e "/localhost/r file2" -e "/localhost/d" file1 sed '/localhost/r file2' file1 |sed '/localhost/d' sed -e '/localhost/r file2' -e "s///" …

7
การแข่งขันแบบไม่โลภกับ SED regex (เลียนแบบ perl's. *?)
ฉันต้องการใช้sedที่จะเปลี่ยนอะไรในสตริงระหว่างครั้งแรกABและครั้งแรกเกิดAC(รวม) XXXด้วย สำหรับตัวอย่างเช่นผมมีสายนี้ (สตริงนี้เหมาะสำหรับการทดสอบเท่านั้น): ssABteAstACABnnACss ssXXXABnnACssและฉันต้องการผลผลิตที่คล้ายกันนี้: ฉันทำสิ่งนี้กับperl: $ echo 'ssABteAstACABnnACss' | perl -pe 's/AB.*?AC/XXX/' ssXXXABnnACss sedแต่ฉันต้องการที่จะใช้มันกับ ต่อไปนี้ (ใช้ regex ที่เข้ากันได้กับ Perl) ไม่ทำงาน: $ echo 'ssABteAstACABnnACss' | sed -re 's/AB.*?AC/XXX/' ssXXXss


4
วิธีลบส่วนที่เหลือของแต่ละบรรทัดหลังจากรูปแบบที่แน่นอนหรือสตริงในไฟล์?
สมมติว่าฉันมีรายการ URL ในไฟล์ข้อความ: google.com/funny unix.stackexchange.com/questions isuckatunix.com/ireallydo ฉันต้องการลบทุกอย่างที่เกิดขึ้นหลังจาก '.com' ผลลัพธ์ที่คาดหวัง: google.com unix.stackexchange.com isuckatunix.com ฉันเหนื่อย sed 's/.com*//' file.txt แต่มันก็ถูกลบ.comเช่นกัน

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