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

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

7
แยกส่วนของหนึ่งบรรทัดจากไฟล์ที่มี sed
ฉันต้องการอ่านส่วนหนึ่งของหนึ่งบรรทัดจากไฟล์ ตัวอย่างเช่น: POP3_SERVER_NAME = localhost ฉันต้องการกลับมาlocalhostโดยใช้ sed ข้อความนี้อยู่ในบรรทัดที่สาม ฉันทำสิ่งนี้เพื่อแยกบรรทัด: sed -n '3p' installation.sh ฉันจะแยกเฉพาะlocalhostส่วนได้อย่างไร
18 sed 

5
รวมสองรายการในขณะที่ลบรายการที่ซ้ำกัน
ฉันมีระบบลินุกซ์ในตัวโดยใช้ Busybox (OpenWRT) - ดังนั้นคำสั่งจะถูก จำกัด ฉันมีสองไฟล์ที่มีลักษณะดังนี้: ไฟล์แรก aaaaaa bbbbbb cccccc mmmmmm nnnnnn ไฟล์ที่สอง mmmmmm nnnnnn yyyyyy zzzzzz ฉันต้องการรวม 2 รายการเหล่านี้เป็น 1 ไฟล์และลบรายการที่ซ้ำกัน ผมไม่ได้มีความแตกต่าง (พื้นที่ จำกัด ) เราจึงได้รับการใช้งานที่ดีawk, sedและgrep(หรือเครื่องมืออื่น ๆ ที่อาจจะรวมอยู่ในอินสแตนซ์ Busybox มาตรฐาน) ไปที่ไฟล์ผสานเช่น: command1 > mylist.merge command2 mylist.merge > originallist ไม่เป็นไร มันไม่จำเป็นต้องเป็นคำสั่งบรรทัดเดียว ฟังก์ชั่นที่กำหนดไว้ในปัจจุบันในกรณีของ Busybox ที่ฉันใช้ (ค่าเริ่มต้น OpenWRT): [, [, …
18 bash  grep  sed  awk  busybox 

2
ใช้ sed เพื่อกำจัดอักขระ <>,
ฉันมีไฟล์ที่มีบรรทัดดังนี้: ... ... &lt;230948203[234]&gt;, ... ... &lt;234[24]&gt;, ... .. ฉันต้องการใช้ sed เพื่อลบอักขระ&lt; ,และ&gt;จากทุกบรรทัด ฉันลองใช้sed 's/&lt;&gt;,//g'แต่มันใช้งานไม่ได้ (มันไม่เปลี่ยนอะไรเลย) ฉันต้องหลบหนีตัวละครพิเศษเหล่านี้หรือไม่ เป็นไปได้ไหมที่จะลบหลายอักขระโดยใช้sedคำสั่งเดียว?
18 sed 

1
ควรใช้ grep, less, awk, sed เมื่อไหร่
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน3 ปีที่ผ่านมา ฉันเข้าสู่โลกของ Linux และที่ทำงานฉันใช้grepมากขึ้นเรื่อย ๆ ด้วยการทำเช่นนั้นฉันก็พบว่าบางครั้งมันก็ไม่เพียงพอสำหรับสิ่งที่ฉันต้องการ ฉันกำลังต่อสู้กับไม่กี่วันที่ผ่านมาและเพื่อนร่วมงานของฉันที่เป็นลินุกซ์ผู้ดูแลระบบอาวุโสบอกให้ผมใช้grep awkฉันตกตะลึงด้วยความเร็วที่ฉันได้รับ ดังนั้นคำถามของฉันคือเมื่อไหร่ที่คุณเลือกที่จะใช้อีกอันหนึ่ง? คำถามอะไรที่ฉันสามารถถามตัวเองก่อนที่จะทำงานด้วยgrepและใช้เวลามากเมื่อฉันสามารถทำได้ด้วยawkและประหยัดเวลา?
17 awk  sed  grep  less 

7
แปลงข้อความทั้งหมดจากตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็กและในทางกลับกัน
คำถามของฉันคือฉันจะแปลงข้อความทั้งหมดจากตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็กและในทางกลับกันได้อย่างไร นั่นคือการเปลี่ยนแปลงกรณีของตัวอักษรทั้งหมด มันจะต้องมีการsedเปลี่ยนอย่างใด
17 sed 


1
ลบบรรทัดที่ค่าของฟิลด์น้อยกว่าหรือเท่ากับ 3 - sed หรือ awk?
ฉันต้องการลบทุกบรรทัดที่มีค่า 2 หรือน้อยกว่าในฟิลด์ที่ 8 (คอลัมน์) ข้อมูลของฉันมีลักษณะเช่นนี้: 12-31 Airport 189 379 41 49.70946503 -124.91377258 2 2880 30.8 01-01 AlberniElementary 165 331 16 49.26100922 -124.80662537 4 5760 26.1 01-09 BamfieldMarine 161 323 23 48.83490372 -125.13572693 2 2875 27.4 01-10 BamfieldMarine 161 323 23 48.83490372 -125.13572693 3 3068 38.6 ฉันเข้าใจว่าการใช้ awk ฉันสามารถตัดค่าที่ต้องการและพิมพ์ไปยังไฟล์อื่นและฉันเข้าใจว่า sed …
17 shell  shell-script  sed  awk  grep 

3
ฉันจะหยุดไม่ให้เพิ่มอักขระบรรทัดใหม่ได้อย่างไร
ฉันรันsedคำสั่ง2 ต่อไปนี้ ตัวแรกเพิ่มตัวอักขระขึ้นบรรทัดใหม่ที่ฉันต้องการตัวที่สองเพิ่มตัวอักขระขึ้นบรรทัดใหม่ตามที่ฉันต้องการ แต่ BUT ยังเพิ่มตัวอักขระพิเศษที่ท้ายไฟล์ซึ่งไม่เคยมีมาก่อน sed -e 's|\&lt;LIST_G_STATEMENT&gt;|&amp;\ |g' ${XMLDIR}/statement_tmp_1.xml &gt; ${XMLDIR}/statement_tmp_2.xml sed -e 's|\&lt;/LIST_G_STATEMENT&gt;|&amp;\ |g' ${XMLDIR}/statement_tmp_2.xml &gt; ${XMLDIR}/statement_tmp_3.xml การใช้od -cไฟล์ทั้ง 3 ตัวให้ผลลัพธ์ต่อไปนี้ statement_tmp_1.xml (ไม่ใช่\nไฟล์ท้ายไฟล์) 1314700 T A T E M E N T &gt; &lt; / L I S T _ 1314720 G _ S T A T …
17 sed 

7
ทำซ้ำแต่ละบรรทัดหลายครั้ง
ต้องการให้แต่ละบรรทัดในไฟล์ซ้ำกันหลายครั้ง เช่นให้แต่ละบรรทัดทำซ้ำสี่ครั้ง: a b c กลายเป็น: a a a a b b b b c c c c ฉันได้ทำการค้นหาแล้วและมีคำถามและคำตอบมากมายในแนวของการย้อนกลับเช่นการรวมบรรทัดที่ซ้ำกันเป็นบรรทัดเดียว มันง่ายที่จะทำใน C แต่ฉันหวังว่าฉันจะรู้มากขึ้นเกี่ยวกับคำสั่งดั้งเดิมดังนั้นฉันจึงไม่ต้องหันไปใช้วิธีการโยนครั้งเดียวแบบนี้ตลอดเวลา

4
ฉันจะ grep โดยไม่มีช่องว่างนำหน้าได้อย่างไร
ฉันกำลัง greping ผ่าน codebase ขนาดใหญ่และ whitespaces และ tabulation ชั้นนำดูเหมือนจะค่อนข้างน่ารำคาญ มีวิธีใดที่จะกำจัดมันได้หรือไม่? grep -R "something" ./ เช่นแทนที่จะเป็น: foo/bar.cpp: qwertyuiosomethingoi foo/bar/baz.h: 43rfsgsomethingdrfg bar/bar.cpp: 1234edwssomethingczd ฉันต้องการได้รับ: foo/bar.cpp: qwertyuiosomethingoi foo/bar/baz.h: 43rfsgdsomethingrfg bar/bar.cpp: 1234edwssomethingczd หรือดีกว่า: foo/bar.cpp: qwertyuisomethingooi foo/bar/baz.h: 43rfsgdrsomethingfg bar/bar.cpp: 1234edwssomethingczd

3
แทนที่สตริงหลายบรรทัดในไฟล์
ฉันมีไฟล์จำนวนหนึ่งที่ฉันต้องการอัปเดตโดยแทนที่สตริงหลายบรรทัดหนึ่งด้วยสตริงอื่นหลายบรรทัด บางสิ่งบางอย่างตาม: * Some text, * something else * another thing และฉันต้องการแทนที่ด้วย: * This is completely * different text ผลที่ตามมาก็คือหลังจากการแทนที่ไฟล์ที่มีบล็อกแรกของข้อความตอนนี้จะมีสตริงที่สอง (ส่วนที่เหลือของไฟล์ไม่เปลี่ยนแปลง) ส่วนหนึ่งของปัญหาคือฉันต้องค้นหารายชื่อไฟล์ที่จะอัพเดทในระบบไฟล์ ฉันเดาว่าฉันสามารถใช้ grep สำหรับสิ่งนั้นได้ (แม้ว่าจะไม่ใช่เรื่องง่ายที่จะทำกับสตริงหลายบรรทัด) จากนั้นลองใช้ greid หรือไม่? มีวิธีง่าย ๆ ในการทำเช่นนี้? Sed เป็นตัวเลือก แต่มันน่าอึดอัดใจเพราะฉันต้องเพิ่ม \ n ฯลฯ มีวิธีที่จะพูดว่า "รับอินพุตจากไฟล์นี้จับคู่กับไฟล์เหล่านั้นจากนั้นแทนที่ด้วยเนื้อหาของไฟล์อื่นนี้" หรือไม่? ฉันสามารถใช้ python ถ้าจำเป็น แต่ฉันต้องการบางสิ่งที่รวดเร็วและง่ายดายดังนั้นหากมียูทิลิตีที่มีอยู่ฉันอยากจะใช้สิ่งนั้นมากกว่าเขียนสคริปต์ของตัวเอง (ซึ่งฉันรู้วิธีการทำ)

12
ลบบรรทัดที่ซ้ำกันเป็นคู่หรือไม่
ฉันพบกรณีใช้งานวันนี้ มันดูเหมือนง่ายได้อย่างรวดเร็วก่อน แต่เล่นซอรอบกับsort, uniq, sedและawkเผยให้เห็นว่ามันเป็นขี้ปะติ๋ว ฉันจะลบบรรทัดที่ซ้ำกันทุกคู่ได้อย่างไร กล่าวอีกนัยหนึ่งหากมีจำนวนซ้ำของบรรทัดที่กำหนดให้ลบทั้งหมด; หากมีจำนวนบรรทัดที่ซ้ำกันเป็นเลขคี่ลบทั้งหมดยกเว้นหนึ่งบรรทัด (สามารถป้อนข้อมูลการเรียงลำดับได้) วิธีการแก้ปัญหาที่สง่างามสะอาดเป็นที่ต้องการ อินพุตตัวอย่าง: a a a b b c c c c d d d d d e ตัวอย่างผลลัพธ์: a d e

3
แทนที่เนื้อหากลุ่มการจับภาพ regex โดยใช้ sed
ฉันพยายามแก้ไขไฟล์ nginx.conf ของฉันโดยทางโปรแกรมซึ่งมีบรรทัดดังนี้: access_log /var/log/nginx/access.log; ซึ่งฉันต้องการให้มีลักษณะเช่นนี้: access_log /dev/stdout; ฉันเชื่อว่า regex ^\s*access_log([^;]*);จะจับ/var/log/nginx/access.logส่วนหนึ่งในกลุ่มการดักจับ แต่ฉันไม่แน่ใจว่าจะแทนที่กลุ่มการจับภาพด้วย sed ได้อย่างไร ฉันได้พยายาม echo " access_log /var/log/nginx/access.log;" | sed 's/^\s*access_log([^;]*);/\1\\\/dev\\\/stdout/' แต่ฉันได้รับข้อผิดพลาด: sed: -e expression #1, char 45: invalid reference \1 on `s' command's RHS ถ้าฉันลองsed -rแล้วไม่มีข้อผิดพลาด แต่ผลลัพธ์ไม่ใช่สิ่งที่ฉันคาดหวัง: /var/log/nginx/access.log\/dev\/stdout ฉันพยายามฉลาดด้วยกลุ่มจับภาพและไม่สนใจและค้นหาคำว่า "access_log /var/log/nginx/access.log โดยตรง" ในกรณีที่การกระจายเปลี่ยนตำแหน่งไฟล์บันทึกเริ่มต้น
16 sed 

8
แทนที่สตริงที่มีการขึ้นบรรทัดใหม่ในไฟล์ขนาดใหญ่
มีใครรู้บ้างเกี่ยวกับเครื่องมือที่ไม่ใช้บรรทัดในการค้นหา / แทนที่สตริงในวิธีที่ค่อนข้างมีประสิทธิภาพ ดูคำถามนี้ด้วย ฉันมีไฟล์ข้อความ + 2GB ที่ฉันต้องการประมวลผลคล้ายกับสิ่งที่ดูเหมือนจะทำ: sed -e 's/&gt;\n/&gt;/g' ซึ่งหมายความว่าผมต้องการที่จะลบบรรทัดใหม่ทั้งหมดที่เกิดขึ้นหลังจากที่มีแต่ไม่ได้ทุกที่อื่นดังนั้นกฎที่ออกมา&gt;tr -d คำสั่งนี้ (ที่ฉันได้จากคำตอบของคำถามที่คล้ายกัน ) ล้มเหลวด้วยcouldn't re-allocate memory: sed --unbuffered ':a;N;$!ba;s/&gt;\n/&gt;/g' ดังนั้นมีวิธีการอื่นใดโดยไม่หันไปใช้ C? ฉันเกลียด Perl แต่ยินดีที่จะยกเว้นในกรณีนี้ :-) ฉันไม่รู้ว่าตัวละครใดที่ไม่ได้เกิดขึ้นในข้อมูลดังนั้นการแทนที่\nด้วยอักขระอื่นชั่วคราวเป็นสิ่งที่ฉันต้องการหลีกเลี่ยงถ้าเป็นไปได้ มีความคิดที่ดีมีใครบ้าง?

2
พิมพ์บรรทัดระหว่าง (และรวมถึง) สองรูปแบบ
ฉันต้องการเริ่ม grepping จากบรรทัดที่มีCKที่ส่วนท้ายของบรรทัดและหยุดการ grepping เมื่อบรรทัดมีDที่สิ้นสุด ฉันพยายามgrep "$CK" "$D" file..txtแต่มันใช้งานไม่ได้ การป้อนข้อมูล: kkkkkkkkkkk jjjjjjjjjjjjjjjjjj gggggggggggg/CK JHGHHHHHHHH HJKHKKLKLLL JNBHBHJKJJLKKL JLKKKLLKJLKJ/D GGGGGGGGGGGGGG GGGGGGGGGGGGGG ผลลัพธ์ที่ต้องการ: gggggggggggg/CK JHGHHHHHHHH HJKHKKLKLLL JNBHBHJKJJLKKL JLKKKLLKJLKJ/D

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