คำถามติดแท็ก text-processing

การจัดการหรือตรวจสอบข้อความโดยโปรแกรมสคริปต์ ฯลฯ

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

4
ทำไม printf ถึงดีกว่า echo
ผมเคยได้ยินว่าจะดีกว่าprintf echoฉันสามารถจำได้เพียงครั้งเดียวจากประสบการณ์ที่ฉันต้องใช้printfเพราะechoไม่ได้ทำงานเพื่อป้อนข้อความบางส่วนในโปรแกรมบางโปรแกรมใน RHEL 5.8 แต่printfทำ แต่เห็นได้ชัดว่ามีความแตกต่างอื่น ๆ และฉันต้องการสอบถามว่าพวกเขาเป็นอย่างไรและมีกรณีที่เฉพาะเจาะจงเมื่อใดที่จะใช้แบบหนึ่งกับอีกแบบหนึ่ง

10
วิธีต่อท้ายหลายบรรทัดในไฟล์
ฉันกำลังเขียนสคริปต์ทุบตีเพื่อค้นหาไฟล์หากไม่มีอยู่ให้สร้างและผนวกกับมัน: Host localhost ForwardAgent yes ดังนั้น"line then new line 'tab' then text"ฉันคิดว่ามันเป็นรูปแบบที่ละเอียดอ่อน ฉันรู้ว่าคุณสามารถทำได้: cat temp.txt >> data.txt แต่มันดูแปลก ๆ ตั้งแต่สองบรรทัด มีวิธีต่อท้ายที่ในรูปแบบนี้หรือไม่: echo "hello" >> greetings.txt

8
grep สามารถส่งออกเฉพาะกลุ่มที่ระบุที่ตรงกันหรือไม่
บอกว่าฉันมีไฟล์: # file: 'test.txt' foobar bash 1 bash foobar happy foobar ฉันแค่อยากรู้ว่าคำใดปรากฏหลัง "foobar" ดังนั้นฉันสามารถใช้ regex นี้: "foobar \(\w\+\)" วงเล็บแสดงว่าฉันมีความสนใจเป็นพิเศษในคำทันทีหลังจาก foobar แต่เมื่อฉันทำgrep "foobar \(\w\+\)" test.txtฉันจะได้ทั้งบรรทัดที่ตรงกับ regex ทั้งหมดมากกว่าเพียงแค่ "คำหลังจาก foobar": foobar bash 1 foobar happy ฉันชอบที่ผลลัพธ์ของคำสั่งนั้นจะเป็นดังนี้: bash happy มีวิธีบอก grep ให้แสดงเฉพาะรายการที่ตรงกับการจัดกลุ่ม (หรือการจัดกลุ่มเฉพาะ) ในนิพจน์ทั่วไปหรือไม่?

4
เหตุใดการใช้เชลล์ลูปเพื่อประมวลผลข้อความจึงถือว่าไม่ดี?
การใช้วนลูปในการประมวลผลข้อความโดยทั่วไปถือว่าเป็นแนวปฏิบัติที่ไม่ดีในเชลล์ POSIX หรือไม่ ในฐานะที่เป็นStéphane Chazelas ชี้ให้เห็นบางส่วนของสาเหตุของการไม่ได้ใช้ห่วงเปลือกความคิด , ความน่าเชื่อถือ , ความสวย , ประสิทธิภาพการทำงานและการรักษาความปลอดภัย คำตอบนี้อธิบายถึงความน่าเชื่อถือและแง่มุมที่ชัดเจน : while IFS= read -r line <&3; do printf '%s\n' "$line" done 3< "$InputFile" สำหรับผลการดำเนินงานที่whileห่วงและอ่านช้าอย่างมากเมื่ออ่านจากไฟล์หรือท่อเพราะอ่านเปลือกในตัวอ่านตัวละครตัวหนึ่งที่เวลา ด้านแนวคิดและความปลอดภัยเป็นอย่างไร?

18
คุณเรียงลำดับผลลัพธ์ตามขนาดอย่างไร
คุณจัดเรียงdu -sh /dir/*ตามขนาดได้อย่างไร ฉันอ่านเว็บไซต์หนึ่งที่กล่าวว่าใช้งาน| sort -nแต่เห็นได้ชัดว่าไม่ถูกต้อง นี่คือตัวอย่างที่ผิด [~]# du -sh /var/* | sort -n 0 /var/mail 1.2M /var/www 1.8M /var/tmp 1.9G /var/named 2.9M /var/run 4.1G /var/log 8.0K /var/account 8.0K /var/crash 8.0K /var/cvs 8.0K /var/games 8.0K /var/local 8.0K /var/nis 8.0K /var/opt 8.0K /var/preserve 8.0K /var/racoon 12K /var/aquota.user 12K /var/portsentry 16K /var/ftp …

20
วิธีการเพิ่มบรรทัดใหม่ในตอนท้ายของไฟล์?
No newline at end of fileโดยใช้ระบบการควบคุมรุ่นที่ฉันได้รับรำคาญที่เสียงเมื่อต่างกล่าวว่า ดังนั้นฉันสงสัยว่า: วิธีเพิ่มบรรทัดใหม่ที่ท้ายไฟล์เพื่อกำจัดข้อความเหล่านั้นได้อย่างไร

10
ฉันจะตัดช่องว่างนำหน้าและต่อท้ายจากแต่ละบรรทัดของเอาต์พุตบางรายการได้อย่างไร
ฉันต้องการลบช่องว่างและแท็บนำหน้าและส่วนท้ายทั้งหมดออกจากแต่ละบรรทัดในเอาต์พุต มีเครื่องมือง่ายๆอย่างที่trimฉันสามารถเอาท์พุทของฉันเป็น? ไฟล์ตัวอย่าง: test space at back test space at front TAB at end TAB at front sequence of some space in the middle some empty lines with differing TABS and spaces: test space at both ends

6
ฉันจะตัดข้อความด้วยขนาดคอลัมน์ที่แน่นอนได้อย่างไร
ฉันรู้ว่าฉันสามารถใช้บางสิ่งบางอย่างเช่นcat test.txt | pr -w 80การตัดบรรทัดที่มีความกว้าง 80 ตัวอักษร แต่นั่นทำให้มีพื้นที่เหลือเฟือที่ด้านบนและด้านล่างของบรรทัดที่พิมพ์ออกมาและมันไม่ทำงานในบางระบบ อะไรคือวิธีที่ดีที่สุดในการบังคับให้ไฟล์ข้อความที่มีเส้นยาวถูกพันด้วยความกว้างที่กำหนด คะแนนโบนัสหากคุณสามารถป้องกันไม่ให้ทำลายคำ

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? มันสมเหตุสมผลไหม มีวิธีแก้ปัญหาที่สง่างามกว่านี้ไหม?

9
วิธีลบบรรทัดที่ซ้ำกันในไฟล์ข้อความ?
ไฟล์ข้อความขนาดใหญ่ (มากถึง 2 GiB) ของฉันมีข้อมูลที่ซ้ำกันประมาณ 100 รายการทุกบรรทัดในนั้น (ไร้ประโยชน์ในกรณีของฉันเนื่องจากไฟล์เป็นตารางข้อมูลที่เหมือน CSV) สิ่งที่ฉันต้องการคือการลบการทำซ้ำทั้งหมดในขณะที่ (โดยเฉพาะอย่างยิ่ง แต่สิ่งนี้สามารถเสียสละเพื่อเพิ่มประสิทธิภาพที่สำคัญ) การรักษาลำดับเดิม ในผลลัพธ์แต่ละบรรทัดจะต้องไม่ซ้ำกัน หากมี 100 เส้นเท่ากัน (โดยปกติรายการที่ซ้ำกันจะกระจายไปทั่วไฟล์และจะไม่เป็นเพื่อนบ้าน) จะต้องมีเพียงหนึ่งในประเภทที่เหลือ ฉันได้เขียนโปรแกรมใน Scala (พิจารณาเป็น Java ถ้าคุณไม่ทราบเกี่ยวกับ Scala) เพื่อดำเนินการนี้ แต่บางทีมีเครื่องมือดั้งเดิมที่เขียนด้วยภาษา C เร็วกว่าสามารถทำสิ่งนี้ได้เร็วขึ้น? อัปเดต: awk '!seen[$0]++' filenameดูเหมือนว่าโซลูชันจะทำงานได้ดีสำหรับฉันตราบใดที่ไฟล์อยู่ใกล้กับ 2 GiB หรือเล็กกว่า แต่ตอนนี้เมื่อฉันต้องล้างไฟล์ 8 GiB มันไม่ทำงานอีกต่อไป ดูเหมือนว่าจะไม่มีที่สิ้นสุดบน Mac ที่มี 4 GiB RAM และ 64-bit Windows 7 …

6
ลบอักขระบางตัวออกจากตัวแปรโดยใช้ bash
ฉันต้องการแยกตัวแปร (ในกรณีของฉันเป็นรุ่นชุดพัฒนา) เพื่อให้ dot ( .) ฟรี หากการส่งออกที่ต้องการคือversion='2.3.3'233 ฉันพยายามที่ดังต่อไปนี้ แต่ต้องถูกแทนที่ด้วยตัวอักษรอีกให้ฉัน. 2_3_3คงจะดีกว่านี้ถ้าใช้tr . ''งานได้ 1 VERSION='2.3.3' 2 echo "2.3.3" | tr . _

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 กลายเป็น ) และอื่น ๆ

15
เครื่องมือมาตรฐานในการแปลงจำนวนไบต์เป็นมนุษย์ KiB MiB ฯลฯ เช่น du, ls1
มีเครื่องมือมาตรฐานที่แปลงจำนวนเต็มจำนวนไบต์เป็นจำนวนที่มนุษย์สามารถอ่านได้ของหน่วยขนาดที่ใหญ่ที่สุดที่เป็นไปได้ในขณะที่รักษาค่าตัวเลขระหว่าง 1.00 ถึง 1023.99? ฉันมีสคริปต์ทุบตี / awk ของตัวเอง แต่ฉันกำลังมองหาเครื่องมือมาตรฐานซึ่งพบได้ในหลาย / distros ส่วนใหญ่ ... บางสิ่งบางอย่างที่มีอยู่โดยทั่วไปมากขึ้นและมีคำสั่ง args บรรทัดคำสั่งง่าย ๆ และ / หรือสามารถรับอินพุต piped นี่คือตัวอย่างของประเภทของผลลัพธ์ที่ฉันกำลังมองหา 1 Byt 173.00 KiB 46.57 MiB 1.84 GiB 29.23 GiB 265.72 GiB 1.63 TiB นี่คือสคริปต์ไบต์ - มนุษย์ (ใช้สำหรับผลลัพธ์ด้านบน) awk -v pfix="$1" -v sfix="$2" 'BEGIN { split( "Byt KiB …

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