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

Sed (Stream EDitor) เป็นเครื่องมือแก้ไขบรรทัดคำสั่งสำหรับสภาพแวดล้อม POSIX Sed ประมวลผลไฟล์อย่างน้อยหนึ่งไฟล์ตามสคริปต์แก้ไขและเขียนผลลัพธ์ไปยังเอาต์พุตมาตรฐาน สร้างขึ้นที่ Bell Labs มาตั้งแต่กลางทศวรรษที่ 70

10
ทำไม sed ถึงไม่รู้จัก \ t เป็นแท็บ
sed "s/\(.*\)/\t\1/" $filename > $sedTmpFile && mv $sedTmpFile $filename ฉันคาดหวังว่าsedสคริปต์นี้จะแทรกtabด้านหน้าของทุกบรรทัด$filenameแต่มันไม่ใช่ ด้วยเหตุผลบางประการจึงเป็นการแทรกtแทน
106 regex  bash  sed 

6
sed หรือ awk: ลบ n บรรทัดตามรูปแบบ
ฉันจะผสมรูปแบบและช่วงตัวเลขใน sed (หรือเครื่องมือที่คล้ายกัน - awk เป็นต้น) ได้อย่างไร สิ่งที่ฉันต้องการทำคือจับคู่บางบรรทัดในไฟล์และลบ n บรรทัดถัดไปก่อนที่จะดำเนินการต่อและฉันต้องการทำเช่นนั้นเป็นส่วนหนึ่งของไปป์ไลน์
106 unix  sed  awk 

4
ข้อผิดพลาด sed: "การอ้างอิงที่ไม่ถูกต้อง \ 1 ใน RHS ของคำสั่ง 's'
ฉันเรียกใช้คำสั่งเปลี่ยนตัวหลายเป็นหลักของการสคริปต์ Colorize สำหรับผู้เชี่ยวชาญ หนึ่งในsedคำสั่งที่ใช้การแสดงออกปกติที่ทำงานพบในเปลือกเป็นกล่าวถึงที่นี่ ปัจจุบัน (ไม่ทำงาน) การดำเนินงานที่สามารถพบได้ที่นี่ เมื่อฉันรวมหนึ่งในตัวแปรของคำสั่งลงในสคริปต์พฤติกรรมที่แตกต่างกันจะเกิดขึ้น: ตัวแปร 1: $ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g" ปรับให้เข้ากับสคริปต์: -re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \ ข้อผิดพลาด:$ sedเปลือกเอาท์พุทข้อมูลเช่นเดียวกับถ้าผมจะพิมพ์ แปลก!? ตัวแปร 2: $ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g" ปรับให้เข้ากับสคริปต์: -e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \ ข้อผิดพลาด: sed: -e expression # 7, char 59: การอ้างอิงที่ไม่ถูกต้อง \ 1 …
106 regex  sed  substitution 

6
วิธีการส่งตัวแปรที่มีเครื่องหมายทับไปยัง sed
คุณส่งตัวแปรที่มีเครื่องหมายทับเป็นรูปแบบไปยังsedอย่างไร? ตัวอย่างเช่นหากฉันมีตัวแปรต่อไปนี้: var="/Users/Documents/name/file" ฉันต้องการส่งต่อให้sedเป็นดังนี้: sed "s/$var/replace/g" "$file" อย่างไรก็ตามฉันได้รับข้อผิดพลาด ฉันจะหลีกเลี่ยงปัญหาได้อย่างไร
106 bash  sed 

11
จะใช้ sed, awk หรือ gawk เพื่อพิมพ์เฉพาะสิ่งที่จับคู่ได้อย่างไร?
ฉันเห็นตัวอย่างและหน้าคนมากมายเกี่ยวกับวิธีการทำสิ่งต่างๆเช่นการค้นหาและแทนที่โดยใช้ sed, awk หรือ gawk แต่ในกรณีของฉันฉันมีนิพจน์ทั่วไปที่ฉันต้องการเรียกใช้กับไฟล์ข้อความเพื่อแยกค่าเฉพาะ ฉันไม่ต้องการทำการค้นหาและแทนที่ สิ่งนี้ถูกเรียกจากทุบตี ลองใช้ตัวอย่าง: ตัวอย่างนิพจน์ทั่วไป: .*abc([0-9]+)xyz.* ตัวอย่างไฟล์อินพุต: a b c abc12345xyz a b c ง่ายเหมือนเสียงนี้ฉันไม่สามารถหาวิธีเรียก sed / awk / gawk ได้อย่างถูกต้อง สิ่งที่ฉันหวังว่าจะทำคือจากในสคริปต์ทุบตีของฉันมี: myvalue=$( sed <...something...> input.txt ) สิ่งที่ฉันได้ลอง ได้แก่ : sed -e 's/.*([0-9]).*/\\1/g' example.txt # extracts the entire input file sed -n 's/.*([0-9]).*/\\1/g' example.txt # …
101 regex  unix  sed  awk  gawk 

6
วิธีใช้ GNU sed บน Mac OS 10.10+ ไม่รองรับ 'brew install --default-names' อีกต่อไป
ภายใต้ Mac OS 10.10.3 ฉันติดตั้ง gnu-sed โดยพิมพ์: brew install gnu-sed --default-names เมื่อฉันพิมพ์อีกครั้งฉันจะได้รับข้อความ: gnu-sed-4.2.2 ติดตั้งแล้ว อย่างไรก็ตามแม้ว่าจะรีบูตระบบและรีสตาร์ท Terminal ฉันก็ยังไม่สามารถใช้ sed เวอร์ชัน GNU ได้ ตัวอย่างเช่น: echo a | sed ’s_A_X_i’ ผลตอบแทน: แฟล็กที่ไม่ถูกต้องในคำสั่งการแทนที่ 'i' ฉันควรทำอย่างไรเพื่อให้เวอร์ชัน GNU ทำงานได้ นี่คือเส้นทางในตัวแปร $ PATH ของฉัน /Users/WN/-myUnix /opt/local/bin /opt/local/sbin /usr/bin /bin /usr/sbin /sbin /usr/local/bin /Applications/calibre.app/Contents/MacOS /opt/ImageMagick/bin /usr/texbin ฉันขอโทษหากคำถามของฉันดูเหมือนชัดเจน แต่ฉันกำลังเรียนรู้เชลล์สคริปต์ด้วยตัวเองและยังไม่ค่อยเข้าใจวิธีการติดตั้งโปรแกรม …
98 macos  bash  sed  homebrew  gnu 

5
วิธีการแยกข้อความจากสตริงโดยใช้ sed?
สตริงตัวอย่างของฉันมีดังนี้: This is 02G05 a test string 20-Jul-2012 02G05ตอนนี้จากสตริงดังกล่าวข้างต้นที่ฉันต้องการที่จะดึง สำหรับสิ่งนั้นฉันลอง regex ต่อไปนี้ด้วย sed $ echo "This is 02G05 a test string 20-Jul-2012" | sed -n '/\d+G\d+/p' แต่คำสั่งด้านบนไม่พิมพ์อะไรเลยและเหตุผลที่ฉันเชื่อคือมันไม่สามารถจับคู่อะไรกับรูปแบบที่ฉันให้มาได้ คำถามของฉันคือฉันทำอะไรผิดที่นี่และจะแก้ไขอย่างไร เมื่อฉันลองใช้สตริงและรูปแบบด้านบนด้วย python ฉันได้ผลลัพธ์ >>> re.findall(r'\d+G\d+',st) ['02G05'] >>>
98 regex  bash  sed 

9
sed Beginner: เปลี่ยนเหตุการณ์ทั้งหมดในโฟลเดอร์
ฉันต้องทำการ regex ค้นหาและแทนที่ไฟล์ทั้งหมดในโฟลเดอร์ (และโฟลเดอร์ย่อย) คำสั่ง linux shell จะทำอย่างไร ตัวอย่างเช่นฉันต้องการเรียกใช้สิ่งนี้กับไฟล์ทั้งหมดและเขียนทับไฟล์เก่าด้วยข้อความใหม่ที่แทนที่ sed 's/old text/new text/g'
98 regex  linux  shell  sed 

6
ใช้ sed และ grep / egrep เพื่อค้นหาและแทนที่
ฉันใช้egrep -Rตามด้วยนิพจน์ทั่วไปที่มีประมาณ 10 สหภาพแรงงานเช่น: .jpg | .png | .gifฯลฯ สิ่งนี้ใช้ได้ดีตอนนี้ฉันต้องการแทนที่สตริงทั้งหมดที่พบด้วย.bmp ฉันกำลังคิดบางอย่างเช่น egrep -lR "\.jpg|\.png|\.gif" . | sed "s/some_expression/.jpg/" file_it_came_form ดังนั้นปัญหาที่นี่คือฉันจะทำนิพจน์ทั่วไปของสหภาพที่คล้ายกันได้sedอย่างไรและฉันจะบอกให้บันทึกการเปลี่ยนแปลงในไฟล์ที่ได้รับอินพุตได้อย่างไร
97 regex  sed  grep 

3
sed ด้วยสตริงตามตัวอักษร - ไม่ใช่ไฟล์อินพุต
สิ่งนี้ควรจะง่าย: ฉันต้องการเรียกใช้sedกับสตริงตัวอักษรไม่ใช่ไฟล์อินพุต หากคุณสงสัยว่าทำไมตัวอย่างเช่นแก้ไขค่าที่เก็บไว้ในตัวแปรไม่จำเป็นต้องเป็นข้อมูลข้อความ เมื่อฉันทำ: sed 's/,/','/g' "A,B,C" โดยที่ A, B, C คือตัวอักษรที่ฉันต้องการเปลี่ยนเป็น A ',' B ',' C ฉันเข้าใจ Can't open A,B,C ราวกับว่ามันคิดว่า A, B, C เป็นไฟล์ ฉันลองวางท่อเพื่อสะท้อน: echo "A,B,C" | sed 's/,/','/g' ฉันได้รับข้อความแจ้ง วิธีที่ถูกต้องทำอย่างไร?
97 linux  unix  sed 

10
แทนที่สตริงในเชลล์สคริปต์โดยใช้ตัวแปร
ฉันใช้โค้ดด้านล่างเพื่อแทนที่สตริงภายในเชลล์สคริปต์ echo $LINE | sed -e 's/12345678/"$replace"/g' แต่มันถูกแทนที่ด้วย$replaceแทนค่าของตัวแปรนั้น มีใครบอกได้ไหมว่าเกิดอะไรขึ้น?
94 unix  shell  sed 

5
มี sed ละเว้นบรรทัดที่ไม่ตรงกัน
ฉันจะสร้างsedบรรทัดการจับคู่ตัวกรองตามนิพจน์บางส่วนได้อย่างไร แต่ไม่สนใจบรรทัดที่ไม่ตรงกันแทนที่จะปล่อยให้พิมพ์ ตามตัวอย่างจริงฉันต้องการเรียกใช้scalac(คอมไพเลอร์ Scala) ในชุดไฟล์และอ่านจาก-verboseผลลัพธ์ของ.classไฟล์ที่สร้างขึ้น scalac -verboseส่งออกข้อความจำนวนมาก แต่เราสนใจเฉพาะในรูปแบบ[wrote some-class-name.class]เท่านั้น สิ่งที่ฉันกำลังทำอยู่คือสิ่งนี้ ( |&เป็นวิธี bash 4.0 ในการไพพ์ stderr ไปยังโปรแกรมถัดไป) $ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/' การดำเนินการนี้จะดึงชื่อไฟล์ออกจากข้อความที่เราสนใจ แต่จะปล่อยให้ข้อความอื่น ๆ ผ่านไปโดยไม่เปลี่ยนแปลง! แน่นอนว่าเราสามารถทำสิ่งนี้แทนได้: $ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' | sed 's/^\[wrote \(.*\.class\)\]$/\1/' ซึ่งใช้งานได้ แต่ดูเหมือนการแก้ไขปัญหาที่แท้จริงซึ่งเป็นวิธีการสั่งsedให้ละเว้นบรรทัดที่ไม่ตรงกันจากอินพุต แล้วเราจะทำอย่างไร?
94 sed 

7
เพิ่มข้อความที่ส่วนท้ายของแต่ละบรรทัด
ฉันใช้บรรทัดคำสั่ง Linux และฉันมีไฟล์ 127.0.0.1 128.0.0.0 121.121.33.111 ฉันต้องการ 127.0.0.1:80 128.0.0.0:80 121.121.33.111:80 ฉันจำได้ว่าเพื่อนร่วมงานของฉันใช้ sed สำหรับสิ่งนั้น แต่หลังจากอ่านคู่มือ sed ก็ยังไม่ชัดเจนว่าจะทำอย่างไรในบรรทัดคำสั่ง?
93 sed 

2
วิธีที่ง่ายที่สุดในการแทนที่ช่องว่างสีขาวด้วย (ขีดล่าง) _ ใน bash [ปิด]
มันยากที่จะบอกว่ากำลังถามอะไรที่นี่ คำถามนี้คลุมเครือคลุมเครือไม่สมบูรณ์กว้างเกินไปหรือมีวาทศิลป์และไม่สามารถตอบได้อย่างสมเหตุสมผลในรูปแบบปัจจุบัน สำหรับความช่วยเหลือในการทำความเข้าใจคำถามนี้เพื่อที่จะสามารถเปิด, ไปที่ศูนย์ช่วยเหลือ ปิดให้บริการใน11 ปีที่ผ่านมา เมื่อเร็ว ๆ นี้ฉันต้องเขียนสคริปต์เล็กน้อยที่แยกวิเคราะห์ VM ใน XenServer และเนื่องจากชื่อของ VM ส่วนใหญ่มีช่องว่างสีขาวเช่น Windows XP หรือ Windows Server 2008 ฉันจึงต้องตัดช่องว่างสีขาวเหล่านั้นและแทนที่ด้วยเครื่องหมายขีดล่าง _ ฉันพบวิธีง่ายๆในการทำสิ่งนี้โดยใช้ sed ซึ่งเป็นเครื่องมือที่ยอดเยี่ยมเมื่อพูดถึงการจัดการสตริง echo "This is just a test" | sed -e 's/ /_/g' ผลตอบแทน This_is_just_a_test มีวิธีอื่นในการทำให้สำเร็จหรือไม่?
92 bash  sed 


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