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

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

8
ฉันจะแทนที่สตริงในไฟล์ได้อย่างไร?
การแทนที่สตริงในไฟล์ตามเกณฑ์การค้นหาบางอย่างเป็นงานที่พบบ่อยมาก ฉันสามารถ แทนที่สตริงfooด้วยbarในไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันหรือไม่ ทำแบบเดียวกันซ้ำสำหรับไดเรกทอรีย่อย? แทนที่เฉพาะถ้าชื่อไฟล์ตรงกับสายอื่น? แทนที่เฉพาะในกรณีที่พบสตริงในบริบท? แทนที่หากสตริงอยู่ในหมายเลขบรรทัดที่แน่นอน? แทนที่สตริงจำนวนมากด้วยการแทนที่เดียวกัน แทนที่หลายสตริงด้วยการแทนที่ที่แตกต่างกัน
752 text-processing  awk  sed  perl 

3
ฉันต้องหลบตัวละครอะไรเมื่อใช้ sed ในสคริปต์ sh?
ใช้สคริปต์ต่อไปนี้: #!/bin/sh sed 's/(127\.0\.1\.1)\s/\1/' [some file] หากฉันพยายามเรียกใช้สิ่งนี้ในsh( dashที่นี่) มันจะล้มเหลวเนื่องจากวงเล็บซึ่งต้องหลีกหนี แต่ฉันไม่จำเป็นต้องหลบหลีกแบ็กสแลชตัวเอง (ระหว่างออคเต็ตหรือใน\sหรือ\1) กฎนี่คืออะไร สิ่งที่เกี่ยวกับเมื่อฉันจำเป็นต้องใช้{...}หรือ[...]? มีรายการสิ่งที่ฉันทำและไม่จำเป็นต้องหลบหนีหรือไม่?

14
ฉันจะใช้ sed เพื่อแทนที่สตริงหลายบรรทัดได้อย่างไร
ฉันสังเกตเห็นว่าถ้าฉันเพิ่ม\nรูปแบบสำหรับการทดแทนโดยใช้sedมันไม่ตรงกัน ตัวอย่าง: $ cat > alpha.txt This is a test Please do not be alarmed $ sed -i'.original' 's/a test\nPlease do not/not a test\nBe/' alpha.txt $ diff alpha.txt{,.original} $ # No differences printed out ฉันจะทำให้เรื่องนี้ทำงานได้อย่างไร

14
แทนที่สตริงในขนาดใหญ่ (70GB) หนึ่งบรรทัดไฟล์ข้อความ
ฉันมีขนาดใหญ่ (70GB) หนึ่งบรรทัดไฟล์ข้อความและฉันต้องการแทนที่สตริง (โทเค็น) ในนั้น ฉันต้องการแทนที่โทเค็น<unk>ด้วยโทเค็นจำลองอีกตัว ( ปัญหาถุงมือ ) ฉันพยายามsed: sed 's/<unk>/<raw_unk>/g' < corpus.txt > corpus.txt.new แต่ไฟล์ที่ส่งออกcorpus.txt.newมีศูนย์ไบต์! ฉันยังลองใช้ Perl: perl -pe 's/<unk>/<raw_unk>/g' < corpus.txt > corpus.txt.new แต่ฉันได้รับข้อผิดพลาดหน่วยความจำไม่เพียงพอ สำหรับไฟล์ขนาดเล็กคำสั่งทั้งสองข้างต้นจะใช้งานได้ ฉันจะแทนที่สตริงเป็นไฟล์ดังกล่าวได้อย่างไร นี่เป็นคำถามที่เกี่ยวข้อง แต่ไม่มีคำตอบสำหรับฉันเลย แก้ไข : สิ่งที่เกี่ยวกับการแยกไฟล์ในกลุ่มของ 10GBs (หรืออะไรก็ได้) และนำไปใช้sedกับแต่ละคนแล้วรวมกับพวกเขาcat? มันสมเหตุสมผลไหม มีวิธีแก้ปัญหาที่สง่างามกว่านี้ไหม?

11
ลบบรรทัดแรกของไฟล์
ฉันจะลบบรรทัดแรกของไฟล์และเก็บการเปลี่ยนแปลงได้อย่างไร ฉันลองมัน แต่มันจะลบเนื้อหาทั้งหมดของไฟล์ $sed 1d file.txt > file.txt
110 shell-script  sed  ksh 

4
ส่งคืนเฉพาะส่วนของบรรทัดหลังจากรูปแบบการจับคู่
ดังนั้นการดึงเปิดไฟล์ด้วยcatและจากนั้นใช้grepในการรับสายการจับคู่เพียงทำให้ฉันได้รับเมื่อฉันทำงานกับชุดบันทึกเฉพาะที่ฉันจัดการกับ มันต้องการวิธีการจับคู่ลายเส้นกับรูปแบบ แต่เพื่อคืนส่วนของเส้นหลังการจับคู่เท่านั้น ส่วนก่อนและหลังการแข่งขันจะแตกต่างกันอย่างสม่ำเสมอ ฉันได้เล่นโดยใช้sedหรือawkแต่ไม่สามารถหาวิธีกรองบรรทัดเพื่อลบส่วนหนึ่งก่อนการแข่งขันหรือเพียงแค่คืนส่วนหลังการแข่งขันทั้งคู่จะทำงาน นี่คือตัวอย่างของบรรทัดที่ฉันต้องการกรอง: 2011-11-07T05:37:43-08:00 <0.4> isi-udb5-ash4-1(id1) /boot/kernel.amd64/kernel: [gmp_info.c:1758](pid 40370="kt: gmp-drive-updat")(tid=100872) new group: <15,1773>: { 1:0-25,27-34,37-38, 2:0-33,35-36, 3:0-35, 4:0-9,11-14,16-32,34-38, 5:0-35, 6:0-15,17-36, 7:0-16,18-36, 8:0-14,16-32,34-36, 9:0-10,12-36, 10-11:0-35, 12:0-5,7-30,32-35, 13-19:0-35, 20:0,2-35, down: 8:15, soft_failed: 1:27, 8:15, stalled: 12:6,31, 20:1 } ส่วนที่ฉันต้องการคือทุกอย่างหลังจาก "จนตรอก" เบื้องหลังที่อยู่เบื้องหลังคือฉันสามารถค้นหาได้ว่ามีบางสิ่งที่แผงลอย: cat messages | grep stalled | wc -l …

13
การถอดรหัสการเข้ารหัส URL (การเข้ารหัสเป็นเปอร์เซ็นต์)
ฉันต้องการถอดรหัสการเข้ารหัส URL มีเครื่องมือในตัวสำหรับการทำเช่นนี้หรือใครสามารถให้sedรหัสที่จะทำเช่นนี้ได้หรือไม่ ฉันค้นหาบิตผ่านunix.stackexchange.comและบนอินเทอร์เน็ต แต่ฉันไม่พบเครื่องมือบรรทัดคำสั่งใด ๆ สำหรับการถอดรหัสการเข้ารหัส URL สิ่งที่ฉันต้องการทำคือแก้ไขtxtไฟล์เพื่อที่: %21 กลายเป็น ! %23 กลายเป็น # %24 กลายเป็น $ %26 กลายเป็น & %27 กลายเป็น ' %28 กลายเป็น ( %29 กลายเป็น ) และอื่น ๆ

7
มีการสอนพื้นฐานสำหรับ grep, awk และ sed หรือไม่? [ปิด]
ฉันเคยเป็นผู้ใช้ลีนุกซ์มาระยะหนึ่งแล้วและฉันก็เข้าใจดีมากเกี่ยวกับยูทิลิตี้บรรทัดคำสั่งทั่วไป แต่คนที่มาขึ้นและขึ้นอีกครั้งในความสัมพันธ์กับการเขียนโปรแกรมgrep, และawksed เกี่ยวกับสิ่งเดียวที่ฉันใช้ grep สำหรับคือการวางข้อมูลลงในไฟล์เพื่อค้นหาไฟล์ในล็อกไฟล์ผลลัพธ์ของไฟล์psอื่น ๆ ที่ฉันไม่ได้ใช้awkหรือsedเลย มีแบบฝึกหัดที่ดีสำหรับสาธารณูปโภคเหล่านี้หรือไม่?
95 grep  sed  awk 

6
แปลงเนื้อหาไฟล์เป็นตัวพิมพ์เล็ก
ฉันมีtempไฟล์ที่มีเนื้อหาตัวพิมพ์เล็กและตัวพิมพ์เล็ก อินพุต เนื้อหาของtempไฟล์ของฉัน: hi Jigar GANDHI jiga ฉันต้องการที่จะแปลงบนไปล่าง คำสั่ง ฉันลองคำสั่งต่อไปนี้: sed -e "s/[A-Z]/[a-z]/g" temp แต่มีเอาต์พุตผิด เอาท์พุต ฉันต้องการมันเป็น: hi jigar gandhi jiga สิ่งที่จะต้องมีในแทนส่วนของการโต้แย้งสำหรับsed?

7
ใช้ sed เพื่อค้นหาและแทนที่สตริงที่ซับซ้อน (ดีกว่าด้วย regex)
ฉันมีไฟล์ที่มีเนื้อหาดังต่อไปนี้: <username><![CDATA[name]]></username> <password><![CDATA[password]]></password> <dbname><![CDATA[name]]></dbname> และฉันต้องสร้างสคริปต์ที่เปลี่ยน "ชื่อ" ในบรรทัดแรกเป็น "บางอย่าง", "รหัสผ่าน" ในบรรทัดที่สองเป็น "someelse" และ "ชื่อ" ในบรรทัดที่สามเป็น "somethingdifferent" ฉันไม่สามารถพึ่งพาลำดับของสิ่งที่เกิดขึ้นเหล่านี้ในไฟล์ดังนั้นฉันจึงไม่สามารถแทนที่ "ชื่อ" ด้วย "บางอย่าง" เป็นครั้งแรกและเกิดขึ้นเป็นครั้งที่สองของ "ชื่อ" ด้วย "somethingdifferent" ฉันต้องค้นหาสตริงโดยรอบเพื่อให้แน่ใจว่าฉันค้นหาและแทนที่สิ่งที่ถูกต้อง จนถึงตอนนี้ฉันได้ลองคำสั่งนี้เพื่อค้นหาและแทนที่เหตุการณ์ "ชื่อ" แรก: sed -i "s/<username><![CDATA[name]]><\/username>/something/g" file.xml อย่างไรก็ตามมันไม่ทำงานดังนั้นฉันจึงคิดว่าตัวละครบางตัวอาจต้องหลบหนี ฯลฯ โดยหลักการแล้วฉันยินดีที่จะใช้ regex เพียงแค่จับคู่ "ชื่อผู้ใช้" สองครั้งและแทนที่ "ชื่อ" เท่านั้น บางอย่างเช่นนี้ แต่ด้วยsed: <username>.+?(name).+?</username> และแทนที่เนื้อหาในวงเล็บด้วย "บางอย่าง" เป็นไปได้ไหม


10
วิธีแทรกข้อความก่อนบรรทัดแรกของไฟล์?
ฉันได้ดูรอบ ๆsedคำสั่งเพื่อเพิ่มข้อความลงในไฟล์ในบรรทัดเฉพาะ งานนี้เพิ่มข้อความหลังบรรทัด 1: sed '1 a\ แต่ฉันต้องการเพิ่มก่อนบรรทัด 1 มันจะเป็น: sed '0 a\ invalid usage of line address 0แต่ฉันได้รับข้อผิดพลาดนี้: ข้อเสนอแนะใด ๆ

7
แสดงไฟล์ทั้งหมดจนถึงการแข่งขัน
grep --before-context 5 แสดง 5 บรรทัดก่อนการแข่งขัน ฉันต้องการแสดงทุกอย่างก่อนการแข่งขัน การgrep --before-context 99999999ทำงานจะได้ผล แต่มันไม่ได้เป็นมืออาชีพมากนัก วิธีการแสดงไฟล์ทั้งหมดถึงการแข่งขัน?

5
ลบบรรทัดที่มีสตริงที่แน่นอนและบรรทัดต่อไปนี้
ฉันใช้สิ่งนี้ cat foo.txt | sed '/bar/d' เพื่อลบบรรทัดที่มีสตริงbarในไฟล์ ฉันต้องการ แต่จะลบเส้นที่และสายโดยตรงหลังจากที่มัน โดยเฉพาะอย่างยิ่งในsed, awkหรือเครื่องมืออื่น ๆ ที่มีอยู่ใน MinGW32 มันเป็นสิ่งที่ตรงกันข้ามกับสิ่งที่ฉันสามารถเข้าgrepกับ-Aและ-Bพิมพ์บรรทัดที่ตรงกันรวมถึงบรรทัดก่อน / หลังบรรทัดที่ตรงกัน มีวิธีง่าย ๆ เพื่อให้บรรลุหรือไม่

6
วิธีตัดหลายช่องว่างให้เป็นหนึ่งเดียวโดยใช้ sed?
sedบน AIX ไม่ได้ทำในสิ่งที่ฉันคิดว่าควรจะเป็น ฉันพยายามแทนที่ช่องว่างหลายช่องด้วยช่องว่างเดียวในเอาต์พุตของ IOSTAT: # iostat System configuration: lcpu=4 drives=8 paths=2 vdisks=0 tty: tin tout avg-cpu: % user % sys % idle % iowait 0.2 31.8 9.7 4.9 82.9 2.5 Disks: % tm_act Kbps tps Kb_read Kb_wrtn hdisk9 0.2 54.2 1.1 1073456960 436765896 hdisk7 0.2 54.1 1.1 1070600212 435678280 …

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