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

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

3
สลับการเกิดทั้งหมดสองสายโดยใช้ sed
สมมติว่าฉันมีไฟล์ที่มีการเกิดขึ้นหลายครั้งของทั้ง StringA และ StringB ฉันต้องการแทนที่การเกิดขึ้นทั้งหมดของ StringA ด้วย StringB และ (พร้อมกัน) การเกิดขึ้นทั้งหมดของ StringB ด้วย StringA ตอนนี้ฉันกำลังทำอะไรบางอย่าง cat file.txt | sed 's/StringB/StringC/g' | sed 's/StringA/StringB/g' | sed 's/StringC/StringA/g' ปัญหาเกี่ยวกับวิธีการนี้คือสมมติว่า StringC ไม่ได้เกิดขึ้นในไฟล์ ในขณะที่นี่ไม่ใช่ปัญหาในทางปฏิบัติวิธีนี้ยังคงรู้สึกสกปรก - นั่นคือมันรู้สึกเหมือนเป็นโอกาสที่จะเรียนรู้เวทมนตร์ยูนิกซ์มากขึ้น :)
13 sed 

5
จะ 'วาง' / ลบตัวอักษรจากด้านหน้าของสตริงได้อย่างไร?
ฉันมีสตริงที่ฉันต้องการจัดการ สตริงเป็นH08W2345678วิธีที่ฉันจะสามารถจัดการกับมันดังนั้นการส่งออกเป็นเพียงแค่W2345678? ในทำนองเดียวกันถ้าฉันต้องการที่จะลดตัวละคร 4 ตัวสุดท้ายจากH08W2345678นั้นฉันH08W234จะทำยังไงดี?

2
แทนที่พื้นที่ว่างค่าที่หายไปด้วยศูนย์
ฉันมีไฟล์ข้อความที่คั่นด้วยแท็บ input.txt ประมาณ 30K บรรทัดฉันต้องการตรวจสอบแต่ละแถว (s1..s30K บรรทัด) สำหรับค่าที่หายไป (เช่นพื้นที่ว่าง) และเติมค่าที่หายไปด้วยค่าศูนย์ดู out.txt input.txt id no1 no2 no3 no4 s1 23 34 45 12 s2 4 4 s3 4 8 0 out.txt id no1 no2 no3 no4 s1 23 34 45 12 s2 0 4 4 0 s3 4 0 8 0

3
ลบอักขระตัวสุดท้ายในคำ แต่ถ้าตัวละครนั้นอยู่ในนั้น - ในทุบตี
วิธีลบตัวอักขระสุดท้ายเฉพาะเมื่อมันอยู่ที่นั่น? การป้อนข้อมูล: OpenOffice.org/m openOffice.org/ozm Pers PFG ฟิล ศ. รับผิดชอบ Roonstr./m roonstr./ozm ผลลัพธ์ที่ต้องการ: OpenOffice.org openOffice.org Pers PFG ฟิล ศ รับผิดชอบ Roonstr roonstr ฉันเข้าใจแล้วจนถึงจุดที่เหลือเท่านั้น แต่น่าเสียดายที่คำสั่ง sed ล่าสุดยังลบตัวอักษรgด้วย: $ cat filename | grep "\." | cut -d"/" -f1 | sed 's/.$//'

2
ฉันจะใช้คำสั่งกับ sudo โดยไม่เปลี่ยนเจ้าของไฟล์ได้อย่างไร
เมื่อฉันใช้ sudo เพื่อทำกิจกรรมกับไฟล์ไฟล์เหล่านี้เปลี่ยนความเป็นเจ้าของ ฉันจะใช้คำสั่งกับ sudo โดยไม่เปลี่ยนเจ้าของไฟล์ได้อย่างไร ตัวอย่างไฟล์ archivos35.sh มาจาก Apache แต่ฉันใช้ sed (กับ usr admin sudo) $ ls -l -rwxr-xrw-. 1 apache apache 181 Aug 5 11:56 archivos35.sh ผู้ใช้adminกับ sudo --- sudo sed -i s/old/new/g archivos35.sh แต่การทำคำสั่งนั้นด้วย sudo จะเปลี่ยนเจ้าของไฟล์ $ ls -l -rwxr-xrw-. 1 admin apache 181 Aug 5 11:56 …
12 sed  sudo  ownership 

3
การจับคู่คำที่มี / ไม่มีช่องว่างต่อท้ายแตกต่างกันอย่างไร
ฉันกำลังเรียนรู้การเขียนสคริปต์เชลล์และฉันใช้ HackerRank อยู่ มีคำถามที่เกี่ยวข้องsedกับเว็บไซต์เดียวกันคือ: 'Sed' command # 1 : สำหรับแต่ละบรรทัดในไฟล์อินพุตที่กำหนดให้แปลงคำแรก 'the' with 'this' การค้นหาและการแปลงควรคำนึงถึงขนาดตัวพิมพ์ ก่อนอื่นเลยฉันลอง sed 's/the/this/' แต่ในกรณีทดสอบตัวอย่างนั้นล้มเหลว จากนั้นฉันก็ลอง sed 's/the /this /' และมันก็ใช้งานได้ ดังนั้นคำถามเกิดขึ้นช่องว่างที่สร้างขึ้นต่างกันอย่างไร ฉันทำอะไรบางอย่างหายไปหรือเปล่า
12 sed  whitespace 

10
สคริปต์ที่ลบช่องว่างพิเศษระหว่างตัวอักษรในข้อความ
ฉันมีเอกสารข้อความที่มีข้อความมากมายซึ่งเพิ่มพื้นที่พิเศษหลังจากตัวอักษรทุกตัว! ตัวอย่าง: T h e b o o k a l s o h a s a n a n a l y t i c a l p u r p o s e w h i c h i s m o r e i m p o …

3
การรวมสองไฟล์ทีละหนึ่งคอลัมน์
ฉันมีไฟล์ขนาดใหญ่ 2 ไฟล์ (3000 คอลัมน์, 15,000 แถว) ของรูปแบบต่อไปนี้ file1 (คั่นด้วยแท็บ): 1/0 0/0 0/0 0/0 1/1 0/0 1/1 0/1 0/0 file2 (คั่นด้วยแท็บ): 3 5 2 1 7 10 3 4 3 ฉันต้องการรวมค่าจากคอลัมน์แรกของแต่ละไฟล์กับตัวคั่น ":" จากนั้นไปยังคอลัมน์ที่สองสามและอื่น ๆ ผลลัพธ์ที่ต้องการ (คั่นด้วยแท็บ): 1/0:3 0/0:5 0/0:2 0/0:1 1/1:7 0/0:10 1/1:3 0/1:4 0/0:3 ประสิทธิภาพไม่สำคัญดังนั้นภาษาใดก็ได้ ฉันขอโทษถ้าสิ่งนี้ถูกถามมาก่อน

3
คุณจะลบอักขระ dot ออกจากสตริงโดยไม่เรียกใช้ sed หรือ awk อีกครั้งได้อย่างไร
ฉันมีไฟล์ชื่อhostlist.txtที่มีข้อความเช่นนี้: host1.mydomain.com host2.mydomain.com anotherhost www.mydomain.com login.mydomain.com somehost host3.mydomain.com ฉันมีสคริปต์เล็ก ๆ ต่อไปนี้: #!/usr/local/bin/bash while read host; do dig +search @ns1.mydomain.com $host ALL \ | sed -n '/;; ANSWER SECTION:/{n;p;}'; done <hostlist.txt \ | gawk '{print $1","$NF}' >fqdn-ip.csv ซึ่งส่งออกไปที่fqdn-ip.csv: host1.mydomain.com.,10.0.0.1 host2.mydomain.com.,10.0.0.2 anotherhost.internal.mydomain.com.,10.0.0.11 www.mydomain.com.,10.0.0.10 login.mydomain.com.,10.0.0.12 somehost.internal.mydomain.com.,10.0.0.13 host3.mydomain.com.,10.0.0.3 คำถามของฉันคือฉันจะลบ.ก่อนจุลภาคโดยไม่ต้องกล่าวอ้างsedหรือgawkอีกครั้งหรือไม่ มีขั้นตอนที่ฉันสามารถแสดงในสายที่มีอยู่sedหรือgawkสายที่จะตัดจุดได้หรือไม่? hostlist.txt จะมีโฮสต์ 1,000 แห่งดังนั้นฉันต้องการให้สคริปต์ของฉันเร็วและมีประสิทธิภาพ

1
จุดประสงค์ของการใช้เครื่องหมายอัศเจรีย์หลายอันใน sed คืออะไร?
POSIX เอกสาร sedกล่าวว่า: ฟังก์ชั่นสามารถนำหน้าด้วย '!' หนึ่งรายการหรือมากกว่า อักขระซึ่งในกรณีนี้จะใช้ฟังก์ชันถ้าที่อยู่ไม่ได้เลือกพื้นที่รูปแบบ ต้องยอมรับอักขระ <blank> ศูนย์หรือมากกว่าก่อนอักษรตัวแรก '!' ตัวละคร ไม่มีการระบุว่าอักขระ <blank> สามารถตาม '!' ได้หรือไม่ อักขระและแอปพลิเคชันที่สอดคล้องจะต้องไม่เป็นไปตาม '!' อักขระที่มีอักขระ <blank> ดังนั้นด้วย POSIX sed เราสามารถ: sed -e '/pattern/!d' file มันเหมือนกับการเขียน: sed -e '/pattern/!!d' file และ!!!dและnของเครื่องหมายอัศเจรีย์จะยังคงได้รับการปรับ (ทดสอบกับสามsedรุ่นจากมรดกตกทอด toolchest ) ฉันไม่เห็นประโยชน์ใด ๆ ระหว่างหลายรายการแทนที่จะแสดงเป็นอัศเจรีย์ ทำไมสเป็คอนุญาตให้ไวยากรณ์นั้นและมันมีประโยชน์ในการใช้งานจริง? ดูเหมือนว่า GNU sed ไม่เข้ากันกับกรณีนี้มันจะบ่นถ้าเราใช้อุทานหลายอย่าง: $ sed -e '/pattern/!!d' …
12 sed  posix 

1
เกี่ยวกับแบบพกพา sed -e ... db หรือ! ข?
ในการแก้ไข นี้Stéphane Chazelas POSIXify (อีกครั้ง)sedการจัดรูปแบบของฉันโดยการแทรกตัว-eแบ่ง xpression และ-eคำสั่ง xpression อื่น ตอนนี้ฉันอาจจะถามเขาว่าทำไมในความคิดเห็นฉันคิดว่า แต่มันก็มีการแก้ไขหมายเลข 18 ในคำตอบนั้นและเกือบทั้งหมดก่อนหน้านี้แล้วขอบคุณฟรีคล้ายกัน(ถ้าคุณสามารถเห็นความคิดเห็นที่ถูกลบคุณจะรู้ว่าสิ่งที่ ผมหมายถึง) นอกจากนี้ฉันคิดว่าฉันเข้าใกล้พอที่จะเข้าใจว่าทำไมวลีนี้ด้วยวิธีที่อาจมีประโยชน์มากกว่า ดังนั้นนี่คือความหวัง ... ฉันมักชอบที่จะให้ทั้งหมดของฉันsed -eXpressions ไปหนึ่งถ้าฉันอาจ แต่ฉันยังมีการตั้งค่ามากขึ้นสำหรับการเป็นไปตามสเปคที่ใกล้เท่าที่จะทำได้โดยเฉพาะอย่างยิ่งเมื่อความแตกต่างจะมีจำนวนไม่เกินและ<space> -eแต่ฉันไม่สามารถทำได้ถ้าฉันไม่เข้าใจว่าทำไมฉันควรทำ นี่เป็นบทสรุปสั้น ๆ เกี่ยวกับสถานะปัจจุบันของความเข้าใจของฉัน: ' -e 'แบ่ง portably สามารถยืนอยู่ในสำหรับsedสคริปต์\nแบ่ง ewline ในsedคำสั่งบรรทัดคำสั่ง ... ฉันยอมรับคลุมเครือเกี่ยวกับสาเหตุ วงเล็บปีกกาปิดในsed {ฟังก์ชั่น}จะต้องนำหน้าด้วยตัว\nแบ่ง ewline ตามที่ระบุไว้ที่นี่: <right-brace>จะนำหน้าด้วย<newline>และสามารถนำหน้าหรือตาม<blank>ตัวอักษร \nแบ่ง ewline เป็นสิ่งจำเป็นในทำนองเดียวกันต่อไปนี้การใช้งานใด ๆ ... a, b, c, i, r, t, …
12 shell  sed  posix 

4
แสดงความคิดเห็นทุกบรรทัดจากบรรทัดที่ถูกคอมเม้นต์ล่าสุดไปยังบรรทัดด้วย 'foo'
พิจารณาไฟล์ข้อความusers.txt: #alice #bob charlie dotan eric ฉันต้องการที่จะแสดงความคิดเห็นทุกอย่างจาก (พิเศษ) เส้นแสดงความคิดเห็นสุดท้ายจนกว่า dotan(รวม) นี่คือผลลัพธ์ที่ได้: #alice #bob #charlie #dotan eric มีผู้แนะนำsedในการทำเช่นนี้หรือไม่ ฉันจะมีความสุขกับเครื่องมือใด ๆ ไม่ใช่แค่sedจริงๆ ขณะนี้ฉันได้รับหมายเลขบรรทัดของบรรทัดที่ถูกคอมเม้นต์ล่าสุดดังนี้: $ cat -n users.txt | grep '#' | tail -n1 2 #bob จากนั้นฉันเพิ่มหนึ่งและแสดงความคิดเห็นด้วยsed: $ sed -i'' '3,/dotan/ s/^/#/' users.txt ฉันรู้ว่าฉันสามารถฉลาดและใส่ทั้งหมดนี้เข้าด้วยกันbcเป็นหนึ่งซับ - น่าเกลียด แน่นอนต้องมีวิธีที่สะอาดกว่า?

4
แยกอักขระก่อน () โดยใช้ grep
ฉันต้องการแยกอักขระก่อนอักขระ '(' โครงสร้างไฟล์ของฉันคือ: ดอกกุหลาบ (ดี) OOK เดซี่ () ไม่มี ลิลลี่ (ไม่ดี) ปรับ ดอกทานตะวัน () มีความสุข ฉันต้องการไฟล์ที่ส่งออกในรูปแบบของ: rose daisy lilly sunflower ใครสามารถบอกคำสั่งนี้ ..... awk, grep หรือ sed ดีกว่า ...
12 sed  awk  grep 

5
sed ทำงานแตกต่างกันใน FreeBSD และบน Linux?
ผมใช้ทั้ง Linux และ FreeBSD (โดยเฉพาะผมใช้ Debian Linux และ PC-BSD) sedและฉันพบบางสิ่งบางอย่างเกี่ยวกับแปลก ฉันมักจะต้องแปลงไฟล์ "ค่าที่คั่นด้วยแท็บ" เป็น "ค่าที่คั่นด้วยเครื่องหมายจุลภาค" วิธีที่ง่ายที่สุดที่ฉันรู้คือใช้sedเช่นนี้ sed 's/\t/,/g' inputFile.txt > outputFile.csv มันใช้งานได้ดีบน Linux: มันแทนที่ทุกแท็บด้วยเครื่องหมายจุลภาค ... แต่บน FreeBSD มันไม่ได้แทนที่อะไรเลย !!! ฉันพลาดอะไรไปรึเปล่า? มีไวยากรณ์กับ FreeBSD sedที่แตกต่างจากหนึ่งบน Linux หรือไม่
12 sed  freebsd 

4
เชื่อมต่อบรรทัดตามคอลัมน์แรกโดย awk หรือ sed
ฉันจะใช้awkในสถานการณ์ต่อไปนี้ได้อย่างไร? ฉันต้องการเชื่อมโยงบรรทัดที่ขึ้นต้นด้วยคอลัมน์เดียวกัน เฉพาะคอลัมน์แรกจะถูกเก็บไว้หลังจากที่เข้าร่วม (ในกรณีนี้aaa, www, hhh) ไฟล์อาจคั่นด้วยช่องว่างหรือแท็บ อินพุตตัวอย่าง: aaa bbb ccc ddd NULL NULL NULL aaa NULL NULL NULL NULL NULL NULL aaa bbb ccc NULL NULL NULL NULL www yyy hhh NULL NULL NULL NULL hhh 111 333 yyy ooo hyy uuuioooy hhh 111 333 yyy ooo hyy NULL …

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