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

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

8
การสลับคอลัมน์ไม่ จำกัด จำนวน
ฉันมีไฟล์ที่มีคอลัมน์ ดูตัวอย่างด้านล่าง: a b c ... z 1 2 3 ... 26 ฉันต้องการสลับคอลัมน์ทั้งหมดที่ 1 กลายเป็นครั้งสุดท้ายที่สองกลายเป็นหนึ่งก่อนที่ผ่านมา ... ฯลฯ z y x ... a 26 25 24 ... 1 มีซับ ( awkหรือsed) ที่ทำสิ่งนี้หรือไม่? ฉันรู้ว่าสามารถใช้งานได้awkเมื่อมีคอลัมน์เพียงไม่กี่คอลัมน์ แต่ฉันต้องการทำสิ่งนี้กับไฟล์ที่มีคอลัมน์หลายพันคอลัมน์ tacทำสิ่งนี้ได้อย่างสมบูรณ์แบบสำหรับบรรทัด ฉันเดาว่าฉันกำลังมองหาคอลัมน์ที่เทียบเท่า rev ไม่ได้ผลสำหรับฉันเพราะมันสลับเนื้อหาในคอลัมน์ด้วย

4
พิมพ์บรรทัดเฉพาะในกรณีที่บรรทัดถัดไปไม่มีการแข่งขันที่เฉพาะเจาะจง
ฉันพยายามค้นหาไฟล์บันทึกสำหรับกิจกรรมที่บันทึกไม่เสร็จสมบูรณ์ ตัวอย่างเช่นฉันบันทึก "กิจกรรมเริ่มต้นสำหรับ ID 1234 ... " และหากประสบความสำเร็จบรรทัดถัดไปจะเป็น "กิจกรรม 1234 เสร็จสมบูรณ์" ฉันพยายามรับบรรทัด "เริ่มต้น ... " ที่ไม่ได้ตามด้วยบรรทัด "เสร็จสมบูรณ์" ที่เกี่ยวข้อง ตัวอย่างไฟล์บันทึก Starting activity for ID 1234 ID 1234 completed successfully Starting activity for ID 3423 ID 3423 completed successfully Starting activity for ID 9876 ID 9876 completed successfully Starting activity for ID …
12 grep  sed  awk 

1
คำสั่ง sed นี้ทำงานอย่างไร
ฉันเจอโซลูชันนี้สำหรับการพิมพ์บรรทัดที่ระบุจากไฟล์ข้อความ: sed '123!d;q' file ทำไมจึงไม่เลิกหลังจากบรรทัดแรกของอินพุตในกรณีนี้
12 sed 

2
รุ่น sed ใดที่ไม่ใช่ GNU sed 4.0
ฉันกำลังพยายามหาเวอร์ชั่นsedที่ฉันใช้บน BusyBox 1.18.3 --versionผลผลิตเป็นที่คลุมเครือ $ sed --version This is not GNU sed version 4.0 sed.cรหัสต่อไปนี้จากที่เกี่ยวข้อง /* Lie to autoconf when it starts asking stupid questions. */ if (argv[1] && !strcmp(argv[1], "--version")) { puts("This is not GNU sed version 4.0"); return 0; } นี่คือส่วนหัว: /* * sed.c - very minimalist version …
12 sed  version  busybox 

4
grep - ลบข้อความหลังจากโทเค็นตัวคั่น
ฉันมีไฟล์ที่ฉันต้องการกำจัดทุกอย่างหลังจากแรก;ในทุกบรรทัด ดังนั้นไฟล์เช่นนี้: sdfsdsdf; fsdfsddf;sdfsd; จะทำให้เกิดสิ่งนี้: sdfsdsdf fsdfsddf เราได้ตรวจสอบและgrep sedฉันขอขอบคุณคำตอบที่รวมคำสั่งทั้งสองนี้

3
จะแสดงเฉพาะบรรทัดสุดท้ายของรายชื่อได้อย่างไร
สมมติว่าฉันสร้างรายชื่อและจัดเรียงไฟล์ตามคุณสมบัติชั่วคราว: ls -ltr -rwxrwxrwx 1 bla bla 4096 Feb 01 20:10 foo1 -rwxrwxrwx 1 bla bla 4096 Feb 01 20:12 foo2 . . . -rwxrwxrwx 1 bla bla 4096 Mar 05 13:25 foo1000 ฉันควรเพิ่มอะไรไว้ด้านหลัง ls -ltr ในไปป์ไลน์เพื่อรับเฉพาะบรรทัดสุดท้ายของรายชื่อ ฉันรู้ว่ามีคนใจอ่อนและตกใจ แต่ฉันไม่รู้วิธีใช้พวกเขาฉันรู้ว่าพวกเขาสามารถทำอะไรได้บ้าง
12 command-line  sed  awk  ls 

4
ฉันจะแทนที่ข้อความหลังจากคำใดคำหนึ่งโดยใช้ sed ได้อย่างไร
.ignoreฉันมีไฟล์ชื่อ projdirในความต้องการที่จะเปลี่ยน ตัวอย่างเช่น: ignore \..* ignore README projdir Snake ฉันต้องการแทนที่ Snake ด้วยเช่น "PacMan" ฉันอ่าน man page แต่ฉันไม่รู้จะทำอย่างไร

2
คุณจะบันทึก regex ที่ซับซ้อนสำหรับการใช้ซ้ำหลายครั้งใน sed ได้อย่างไร
ในการใช้sedฉันมักจะสร้าง regexes ที่ค่อนข้างซับซ้อนและซับซ้อนซึ่งฉันต้องจับคู่สองครั้งในไฟล์ มีวิธีให้ฉันบันทึก regex นี้และเพียงแค่อ้างอิงสองครั้งหรือไม่ บางทีสิ่งที่มีลักษณะเช่นนี้? sed ' complicated_regex=/^(([a-f0-9]{32})+([a-zA-Z0-9=]{{$i}})?)+$/ s/complicated_regex:complicated_regex/simple-output/ ' my_file อัปเดต: คำตอบนำเสนอวิธีการใช้ตัวแปร bash มันใช้งานไม่ได้ test.txtที่กำหนด #test.txt foo bar bar foo และสคริปต์ #!/bin/bash VALUE='foo \([a-z]\+\)' sed 's/"${VALUE}"/foo happy \1/' test.txt สิ่งนี้ควรสร้างผลลัพธ์ foo happy bar bar foo แต่ฉันได้รับข้อผิดพลาดแทน sed: -e expression #1, char 24: invalid reference \1 on `s' …

5
sed ล้มเหลวในการลบอักขระบรรทัดใหม่
ฉันเคยใช้sedมาระยะหนึ่งแล้ว แต่นี่เป็นเรื่องแปลกที่ฉันมาด้วยซึ่งฉันไม่สามารถแก้ไขได้ ให้ฉันอธิบายปัญหาของฉันกับกรณีจริง ฉาก # 1 printf "ls" | xclip -selection clipboard echo "ls" | xclip -selection clipboard ในคำสั่งแรกฉันไปป์printfเอาท์พุทxclipเพื่อที่จะได้รับการคัดลอกไปยังคลิปบอร์ด ตอนนี้สิ่งที่printfแตกต่างechoไม่ได้แทรกบรรทัดใหม่ในตอนท้ายโดยค่าเริ่มต้น ดังนั้นหากฉันวางเนื้อหานี้ลงในเทอร์มินัลlsคำสั่งที่คัดลอกจะไม่ทำงานโดยอัตโนมัติ ในวินาทีมีบรรทัดใหม่ในตอนท้ายดังนั้นการวางเนื้อหาของคลิปบอร์ดยังส่งผลให้การรันคำสั่งในคลิปบอร์ด นี่เป็นสิ่งที่ไม่พึงปรารถนาสำหรับฉัน ดังนั้นฉันต้องการลบการขึ้นบรรทัดใหม่โดยใช้sedแต่มันล้มเหลวดังอธิบายในฉากด้านล่าง ฉาก # 2 echo "ls" | sed -r 's/\n//g' | xclip -selection clipboard เนื้อหาในคลิปบอร์ดยังมีบรรทัดใหม่ เมื่อฉันวางลงในเทอร์มินัลคำสั่งจะทำงานโดยอัตโนมัติ \rฉันยังพยายามเอาตัวละครที่กลับรถ แต่นาดา ดูเหมือนว่าฉันขาดสิ่งที่สำคัญมาก / พื้นฐานไปที่นี่
12 sed  newlines 

2
คำสั่งเพื่อลบจำนวน N บรรทัดแรกในอินพุต
พื้นหลัง ฉันใช้เซิร์ฟเวอร์ SSH และมีผู้ใช้ที่ฉันต้องการลบ ฉันไม่สามารถลบผู้ใช้รายนี้ได้เนื่องจากเขากำลังใช้งานกระบวนการบางอย่างที่ฉันต้องฆ่าเสียก่อน นี่คือขั้นตอนที่ฉันใช้อยู่ในขณะนี้เพื่อค้นหารหัสกระบวนการทั้งหมดของผู้ใช้ที่ฉันกำลังใช้: ps -u user | awk '{print $1;}' ผลลัพธ์มีลักษณะดังนี้: PID 2121 2122 2124 2125 2369 2370 ฉันต้องการไปป์นี้เพื่อkill -9ฆ่ากระบวนการทั้งหมดเพื่อให้ฉันสามารถลบผู้ใช้ที่โง่เช่นนี้: ps -u user | awk '{print $1;}' | sudo xargs kill -9 แต่สิ่งนี้ไม่ทำงานเนื่องจากPIDหัวข้อ: kill: failed to parse argument: 'PID' คำถาม ฉันคิดว่าจะต้องมีคำสั่ง Unix ง่าย ๆ เพื่อลบบรรทัดแรกของอินพุต ฉันรู้ว่าฉันสามารถใช้ tailสิ่งนี้ได้ …
11 command-line  sed  awk  tail  head 

1
POSIX sed ต้องการอะไรสำหรับ `1d; 1,2d 'ซึ่งช่วงที่อยู่เริ่มต้นจากบรรทัดที่ถูกลบไปแล้ว?
ในความคิดเห็นต่อคำถามนี้มีกรณีเกิดขึ้นที่การใช้งาน sed หลาย ๆ ครั้งไม่เห็นด้วยกับโปรแกรมที่ค่อนข้างง่ายและเรา (หรืออย่างน้อยฉัน) ไม่สามารถระบุได้ว่าสเปคนั้นต้องการอะไร ปัญหาคือพฤติกรรมของช่วงที่เริ่มต้นที่บรรทัดที่ถูกลบ: 1d;1,2d ควรลบบรรทัด 2แม้ว่าจุดเริ่มต้นของช่วงจะถูกลบออกก่อนที่จะถึงคำสั่งนั้นหรือไม่ ความคาดหวังเริ่มต้นของฉันคือ "ไม่" สอดคล้องกับ BSD sed ในขณะที่ GNU sed พูดว่า "ใช่" และการตรวจสอบข้อความข้อกำหนดไม่ได้ช่วยแก้ปัญหาทั้งหมด ที่ตรงกับความคาดหวังของฉัน (อย่างน้อย) MacOS และ Solaris sedและ sedBSD ไม่เห็นด้วยคือ (อย่างน้อย) GNU และ Busybox sedและผู้คนมากมายที่นี่ สองคนแรกได้รับการรับรองจาก SUS ขณะที่คนอื่น ๆ มีแนวโน้มที่จะแพร่หลายมากขึ้น พฤติกรรมใดที่ถูกต้อง? ข้อความข้อกำหนดสำหรับช่วงสองที่อยู่พูดว่า: sedยูทิลิตี้แล้วให้ใช้บังคับในลำดับคำสั่งทั้งหมดที่มีอยู่เลือกพื้นที่รูปแบบที่จนกว่าคำสั่งเริ่มต้นรอบถัดไปหรือลาออก และ คำสั่งแก้ไขที่มีสองที่อยู่จะต้องเลือกช่วงที่ครอบคลุมจากพื้นที่รูปแบบแรกที่ตรงกับที่อยู่แรกผ่านพื้นที่รูปแบบต่อไปที่ตรงกับที่สอง [... ] เริ่มต้นที่บรรทัดแรกตามช่วงที่เลือก sed จะค้นหาที่อยู่แรกอีกครั้ง …
11 sed  posix 

2
ลบทุกบรรทัดที่ไม่มีอักขระ n ก่อนตัวคั่น
ฉันมีไฟล์ข้อความที่ยาวมาก (จากที่นี่ ) ซึ่งควรมีอักขระฐานสิบหก 6 ตัวและ 'ตัวแบ่ง' (ซึ่งปรากฏเป็นอักขระตัวเดียวและดูเหมือนจะไม่แสดงอย่างถูกต้องในการทำเครื่องหมายรหัสด้านล่าง) ตามด้วยคำสองสามคำ: 00107B Cisco Systems, Inc 00906D Cisco Systems, Inc 0090BF Cisco Systems, Inc 5080 Cisco Systems, Inc 0E+00 ASUSTek COMPUTER INC. 000C6E ASUSTek COMPUTER INC. 001BFC ASUSTek COMPUTER INC. 001E8C ASUSTek COMPUTER INC. 0015F2 ASUSTek COMPUTER INC. 2354 ASUSTek COMPUTER INC. 001FC6 …


7
ฉันจะแก้ไขบรรทัดที่แตกในตำแหน่งที่ไม่ถูกต้องได้อย่างไร
ไฟล์ข้อความของฉันมีลักษณะเช่นนี้: This is one sentence that is broken. However this is a good one. And this one is somehow, broken into many. ฉันต้องการลบอักขระบรรทัดใหม่ต่อท้ายสำหรับบรรทัดใด ๆ ที่ตามด้วยบรรทัดที่ขึ้นต้นด้วยตัวอักษรตัวพิมพ์เล็ก ดังนั้นควรเป็น: This is one sentence that is broken. However this is a good one. And this one is somehow, broken into many. ฉันจะทำสิ่งนี้ได้อย่างไร แก้ไข: มีคำตอบที่ดีจริงๆที่นี่ …

5
มีทางเลือกอื่นสำหรับคำสั่ง "sed -i" ใน Solaris หรือไม่?
ฉันมีข้อกำหนดในโครงการของฉันเพื่อแทนที่ข้อความที่มีอยู่ในไฟล์เช่นเดียวfooกับข้อความอื่น ๆ เช่นfooofoo: abc.txt name foo foo1 ดังนั้นฉันจึงพยายาม: sed -i "s/foo/fooofoo/g" abc.txt อย่างไรก็ตามฉันได้รับข้อผิดพลาดนี้: sed: ตัวเลือกที่ผิดกฎหมาย - i ฉันพบในคู่มือที่ต้องใช้: sed -i\ "s/foo/fooofoo/g" abc.txt อย่างไรก็ตามสิ่งนี้ไม่ทำงานเช่นกัน ฉันได้พบทางเลือกในperlและawkอีกวิธีหนึ่ง แต่โซลูชั่นใน Solaris sedจะได้รับการชื่นชมมาก ฉันใช้ทุบตีรุ่นนี้: GNU bash รุ่น 3.2.57 (1) - ปล่อย (sparc-sun-solaris2.10)

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