อะไรที่ไม่ดีและใช้ทำอะไร


20

ฉันได้เห็นsedเมื่อเร็ว ๆ นี้จำนวนมากและฉันคิดว่ามันเป็นคำสั่งที่ค่อนข้างสับสน manpages ไม่มีประโยชน์อย่างยิ่ง แต่ฉันรู้ว่ามันสามารถใช้สำหรับการแยกวิเคราะห์ผลลัพธ์ของคำสั่งอื่น ๆ

มันคืออะไรsedและมันใช้อะไรกันแน่? ฉันกำลังมองหาคำตอบที่ครอบคลุมสิ่งที่sedเป็นสิ่งที่มักจะใช้และตัวอย่างพื้นฐาน / ไวยากรณ์


3
จากหน้าคน Sed:Sed is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline). While in some ways similar to an editor which permits scripted edits (such as ed), sed works by making only one pass over the input(s), and is consequently more efficient. But it is sed's ability to filter text in a pipeline which particularly distinguishes it from other types of editors.
saji89

นี่ควรเป็นจุดเริ่มต้นที่ดีสำหรับคำตอบที่ครอบคลุม: en.wikipedia.org/wiki/Sed
saji89

1
info sedman sedมีจำนวนมากขึ้นกว่า จากนั้นในมี/usr/share/doc/sed sedfaq.txt.gz

คำตอบ:


20

ในการใช้งานขั้นพื้นฐานจะใช้สำหรับ 'ค้นหาและแทนที่' ด้วยสตริง

echo "The quick brown fox jumps over the lazy dog" | sed 's/dog/cat/'

ผลตอบแทน

"The quick brown fox jumps over the lazy cat"

Sed จริงๆส่องเมื่อมีการใช้การแสดงออกปกติ

คุณอาจต้องการดูบทความนี้เกี่ยวกับsedมันค่อนข้างครอบคลุม


5

คำนิยาม

Unix System V: คู่มือปฏิบัติ , หนังสือโดย Mark Sobell:

ยูทิลิตี sed คือตัวแก้ไขแบบแบตช์ คำสั่ง sed มักจะเก็บไว้ในไฟล์สคริปต์ . . เพียงพอคุณสามารถให้คำสั่ง sed ง่าย ๆ จากบรรทัดคำสั่ง . .

หน้าคนสำหรับ sed (GNU sed) 4.2.2:

Sed เป็นโปรแกรมแก้ไขสตรีม ตัวแก้ไขสตรีมใช้สำหรับเปลี่ยนรูปแบบการแปลงข้อความพื้นฐานในอินพุตสตรีม (ไฟล์หรืออินพุตจากไพพ์ไลน์)

คำจำกัดความที่ไม่เป็นทางการของฉัน:

Sed(ย่อมาจากตัวแก้ไขสตรีม ) เป็นโปรแกรมประมวลผลข้อความที่พัฒนาขึ้นในเวลาที่ข้อความถูกประมวลผลทีละบรรทัด แต่ยังคงเป็นหนึ่งในยูทิลิตี้ Unix / Linux ที่ทรงพลังที่สุด ในเวลาเดียวกันมันเป็นรูปแบบของภาษาสคริปต์ที่ออกแบบมาโดยเฉพาะสำหรับการประมวลผลข้อความ

การใช้ประโยชน์

ตามคำจำกัดความที่แนะนำsedใช้สำหรับบรรทัดการประมวลผลแบบแบตช์ไฟล์ข้อความและไพพ์ไลน์ของข้อความ ส่วนใหญ่จะใช้สำหรับการแทนที่เช่นเดียวกับการลบข้อความ:

echo "stackexchange" | sed 's/stackexchange/askubuntu/'

อย่างไรก็ตามมันอาจถูกใช้เพื่อเลียนแบบพฤติกรรมของคำสั่งอื่นตัวอย่างเช่น

  • เพื่อเลียนแบบ dmesg | head -n 3(พิมพ์ครั้งแรก 3 สาย) dmesg | sed -n 1,3pที่เราสามารถทำได้
  • เพื่อเลียนแบบdmesg | grep 'wlan0'(ค้นหาสตริง) เราสามารถทำได้dmesg | sed -n '/wlan0/p'
  • รายการสินค้า

ข้อได้เปรียบที่ยิ่งใหญ่ที่sedมีเหนือยูทิลิตี้การประมวลผลข้อความอื่น ๆ คือการ-iตั้งค่าสถานะซึ่งหมายความว่าเราไม่สามารถส่งออกข้อความที่แก้ไขไปยังหน้าจอ แต่จริง ๆ แล้วบันทึกการแก้ไขไปยังไฟล์ต้นฉบับ awkในทางตรงกันข้ามรสชาติมีเพียงคุณลักษณะดังกล่าวในGNU awkรุ่นเท่านั้น

sedสามารถรับอินพุตในบรรทัดคำสั่งโดยมีหลายรูปแบบคั่นด้วยเครื่องหมายอัฒภาค ( ;) หรือจากไฟล์สคริปต์ที่ระบุหลังการ-fตั้งค่าสถานะเช่นcat someTextfile.txt | sed -f myScript.sed

แอปพลิเคชันและตัวอย่างที่ไม่ดี


1

sed เป็นคำสั่งที่มีประสิทธิภาพที่ช่วยให้คุณทำสิ่งต่าง ๆ (ลบบรรทัดการแทนที่สตริงการกรองสตริง ฯลฯ )

ฉันจะให้รายการการใช้กับ args แต่อินเทอร์เน็ตเต็มไปด้วยสิ่งนั้น ค้นหาsed usage by examplesนำมาให้ฉันมากผลที่น่ารักที่หนึ่ง: http://www.thegeekstuff.com/2009/10/unix-sed-tutorial-advanced-sed-substitution-examples/


1

คำตอบนี้เป็นงานที่ทำอยู่ - มันหายไปตัวอย่างมากขึ้นเกี่ยวกับคำสั่ง susbstitute


คือsedอะไร

sed = กระแสบรรณาธิการ

คำอธิบายในหน้าคู่มือสำหรับsedรายงานGNU 4.2.2:

Sed เป็นโปรแกรมแก้ไขสตรีม สตรีมเอดิเตอร์ใช้เพื่อดำเนินการแปลงข้อความพื้นฐานบนอินพุตสตรีม (ไฟล์หรืออินพุตจากไพพ์ไลน์) ในขณะที่ในบางวิธีคล้ายกับโปรแกรมแก้ไขที่อนุญาตให้มีการแก้ไขแบบสคริปต์ (เช่น ed) ทำงานได้โดยการส่งผ่านอินพุตเพียงครั้งเดียวและมีประสิทธิภาพมากกว่า แต่มันเป็นความสามารถของ sed ในการกรองข้อความในไปป์ไลน์ซึ่งแตกต่างโดยเฉพาะจากตัวแก้ไขประเภทอื่น

การประกาศในหน้าGNU sedที่รายงานgnu.org :

sed (สตรีมแก้ไข) ไม่ใช่โปรแกรมแก้ไขข้อความแบบโต้ตอบ แต่จะใช้ในการกรองข้อความเช่นใช้การป้อนข้อความดำเนินการบางอย่าง (หรือชุดการทำงาน) บนตัวมันและส่งข้อความที่แก้ไข sed โดยทั่วไปจะใช้สำหรับการแยกส่วนของไฟล์โดยใช้การจับคู่รูปแบบหรือการแทนที่สตริงที่เกิดขึ้นภายในไฟล์

อะไรคือสิ่งที่sedใช้?

มันสามารถใช้ในการดำเนินการแก้ไขที่ซับซ้อนในการสตรีมข้อมูล (โดยปกติจะเป็นข้อความ แต่ก็สามารถใช้เพื่อแก้ไขข้อมูลไบนารี)

ในกรณีที่พบบ่อยที่สุดของการใช้งานมี:

  • เลือกพิมพ์ / ลบบรรทัดจากไฟล์ข้อความโดยใช้นิพจน์ทั่วไป / พื้นฐานเพิ่มเติม
  • การแทนที่สตริงในไฟล์ข้อความทั่วโลกโดยใช้นิพจน์ปกติพื้นฐาน / ขยาย
  • เลือกแทนที่สตริงในไฟล์ข้อความโดยใช้นิพจน์ปกติพื้นฐาน / ขยาย

นี่คือกรณีของการใช้งานที่ครอบคลุมในคำตอบนี้

การใช้

sedอ่านอินพุตจากไฟล์ที่เก็บไว้ในระบบไฟล์หากระบุชื่อไฟล์ในอาร์กิวเมนต์บรรทัดคำสั่งระหว่างการเรียกใช้หรือจากstdinหากไม่มีการระบุชื่อไฟล์

การร้องขอขั้นต่ำโดยใช้ไฟล์ที่เก็บไว้ในระบบไฟล์:

sed '' file

การร้องขอขั้นต่ำโดยใช้stdin:

# herestring
<<<'Hello, World!' sed ''

# heredoc
<<'EOF' sed ''
heredoc> Hello, World!
heredoc> EOF

# file
<'file' sed ''

# pipe
echo 'Hello, World!' | sed ''

สวัสดีชาวโลก!

sedโดยค่าเริ่มต้นอ่านไฟล์อินพุตบรรทัดต่อบรรทัด; มันอ่านหนึ่งบรรทัดมันจะลบบรรทัดขึ้นบรรทัดใหม่ของบรรทัดและวางบรรทัดที่ประมวลผลลงใน "pattern space"; ในที่สุดมันจะดำเนินการคำสั่งที่ระบุไว้ในเนื้อหาปัจจุบันของพื้นที่รูปแบบและอ่านบรรทัดใหม่จากอินพุตไฟล์

เมื่อไม่ได้ระบุคำสั่งหรือเมื่อมีpการdระบุคำสั่งหรือ* sedจะพิมพ์เนื้อหาปัจจุบันของพื้นที่รูปแบบตามด้วยบรรทัดใหม่ในแต่ละการวนซ้ำโดยไม่คำนึงถึง:

user@debian ~ % sed '' file
Hello, world! # no command but the lines are printed
user@debian ~ % sed 'p' file
Hello, World!
Hello, World! # the p command prints the lines already printed
user@debian ~ % sed 'd' file
user@debian ~ % # the d command deletes the lines that would be printed

เพื่อป้องกันสิ่งนี้อาจเรียกใช้sedพร้อมกับ-nสวิตช์:

user@debian ~ % sed -n '' file
user@debian ~ % sed -n 'p' file
Hello, World!
user@debian ~ % sed -n 'd' file
user@debian ~ % 

* พูดเฉพาะสำหรับp, dและsคำสั่งซึ่งเป็นคำสั่งที่ครอบคลุมในคำตอบนี้

การเลือกสาย

sedสามารถประมวลผลไฟล์อินพุตทั้งหมดหรือประมวลผลเฉพาะบรรทัดที่เลือกของไฟล์อินพุต การเลือกบรรทัดของไฟล์อินพุตที่จะถูกประมวลผลทำได้โดยการระบุ "ที่อยู่"; ที่อยู่สามารถเป็นได้ทั้งหมายเลขบรรทัดหรือรูปแบบ อาจเลือกช่วงของเส้นโดยระบุช่วงของที่อยู่

การรวมกันของที่อยู่ที่เป็นไปได้คือ:

  • <N>(โดยที่<N>เป็นตัวเลข): ​​คำสั่ง / คำสั่งต่อไปนี้จะถูกเรียกใช้งานบนหมายเลขบรรทัด<N>เท่านั้น
  • <N>,<M>(โดยที่<N>และ<M>เป็นตัวเลขสองตัว, <N>> <M>): คำสั่ง / คำสั่งต่อไปนี้จะถูกดำเนินการบนบรรทัดตั้งแต่หมายเลข<N>บรรทัดไปยังหมายเลขบรรทัด<M>รวม;
  • /<pattern>/(โดยที่<pattern>เป็นนิพจน์ทั่วไปพื้นฐานหรือแบบขยาย): คำสั่ง / คำสั่งต่อไปนี้จะถูกดำเนินการเฉพาะในบรรทัดที่มีการเกิดขึ้นของ<pattern>;
  • /<pattern1>/,/<pattern2>/(ที่<pattern1>และ<pattern2>เป็นพื้นฐานหรือขยายการแสดงออกปกติ): คำสั่งต่อไป / คำสั่งจะถูกดำเนินการในสายตั้งแต่บรรทัดแรกที่มีการเกิดขึ้นของ<pattern1>ยังบรรทัดถัดไปที่มีการเกิดขึ้นของ<pattern2>หลายครั้งในกรณีของหลายสั่งซื้อ<pattern1>- <pattern2>ปรากฏ;
  • <N>,/pattern/(โดยที่<N>เป็นตัวเลขและ<pattern>เป็นนิพจน์ทั่วไปพื้นฐานหรือแบบขยาย): คำสั่ง / คำสั่งต่อไปนี้จะถูกดำเนินการบนบรรทัดที่มีตั้งแต่หมายเลขบรรทัด<N>ไปจนถึงบรรทัดแรกที่มีการปรากฏของ<pattern>;
  • /pattern/,<N>(ที่<pattern>เป็นพื้นฐานหรือขยายการแสดงออกปกติและ<N>เป็นตัวเลข): คำสั่งต่อไป / คำสั่งจะถูกดำเนินการในสายตั้งแต่บรรทัดแรกที่มีการเกิดขึ้นของ<pattern>การหมายเลขบรรทัด<N>;

การเลือกที่ดำเนินการเพื่อพิมพ์ลบหรือทำการทดแทนในช่วงของบรรทัดจะรวมถึงบรรทัดที่ตรงกับที่อยู่ที่ระบุเสมอ นอกจากนี้การเลือกดำเนินการเพื่อพิมพ์ลบหรือดำเนินการแทนในช่วงของบรรทัดที่ใช้รูปแบบคือสันหลังยาวและทั่วโลก (กล่าวคือช่วงที่ได้รับผลกระทบแต่ละช่วงจะมีขนาดเล็กที่สุดเท่าที่จะทำได้และจะได้รับผลกระทบหลายช่วง)

เมื่อทำการพิมพ์ช่วงของบรรทัดหรือพิมพ์เฉพาะบรรทัดที่มีการทำการทดแทนก็จำเป็นต้องเรียกใช้sedพร้อมกับ-nสวิตช์เพื่อป้องกันไม่ให้บรรทัดที่ตรงกับเกณฑ์ที่จะพิมพ์สองครั้ง (เกิดขึ้นเฉพาะเมื่อพิมพ์ช่วงของบรรทัด) และตามลำดับ เพื่อป้องกันไม่ให้บรรทัดที่ไม่ตรงกับเกณฑ์ที่จะพิมพ์โดยไม่คำนึงถึง

การเลือกบรรทัดที่ต้องดำเนินการต้องทำตามคำสั่งหรือโดยคำสั่งที่คั่นด้วยเครื่องหมายอัฒภาคหลายกลุ่มโดยใช้เครื่องหมายวงเล็บ

คำสั่ง: พิมพ์, ลบ

คำสั่งที่ใช้พิมพ์หรือลบส่วนที่เลือก ได้แก่ :

  • p: พิมพ์บรรทัดที่ตรงกับที่อยู่ / ช่วงของที่อยู่ที่ระบุ
  • d: ลบบรรทัดที่ตรงกับที่อยู่ / ช่วงของที่อยู่ที่ระบุ

เมื่อหนึ่งในคำสั่งเหล่านี้ไม่ได้นำหน้าด้วยที่อยู่ / การเลือกคำสั่งจะถูกดำเนินการทั่วโลกเช่นในแต่ละบรรทัดของไฟล์อินพุต

ตัวอย่าง: พิมพ์ลบ

การพิมพ์ / การลบบรรทัดที่ระบุที่อยู่ตัวเลข:

ไฟล์ตัวอย่าง:

line1
line2
line3
line4
line5
  • สายการพิมพ์<N>:
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
  • การลบบรรทัด<N>:
sed '<N>d' file
user@debian ~ % sed '3d' file
line1
line2
line4
line5
  • พิมพ์เส้น<N>ที่จะ<M>รวม:
sed -n '<N>,<M>p' file
user@debian ~ % sed -n '2,4p' file
line2
line3
line4
  • การลบบรรทัด<N>เป็น<M>รวม:
sed '<N>,<M>d' file
user@debian ~ % sed '2,4d' file
line1
line5

การพิมพ์ / การลบบรรทัดที่ระบุรูปแบบ:

ไฟล์ตัวอย่าง:

First line
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
Last line
  • การพิมพ์การจับคู่สาย<pattern>:
sed -n '/<pattern>/p' file
user@debian ~ % sed -n '/print/p' file
Start printing / deleting here
Stop printing / deleting here
  • การลบการจับคู่บรรทัด<pattern>:
sed '/<pattern>/d' file
user@debian ~ % sed '/print/d' file 
First line
Random line
Random line
Random line
Last line
  • การพิมพ์บรรทัดจากการจับคู่บรรทัด<pattern1>ไปยังการจับคู่บรรทัด<pattern2>รวม:
sed -n '/<pattern1>/,/<pattern2>/p' file
user@debian ~ % sed -n '/Start/,/Stop/p' file
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
  • การลบบรรทัดจากการจับคู่บรรทัด<pattern1>ไปยังการจับคู่บรรทัด<pattern2>รวม:
sed '/<pattern1>/,/<pattern2>/d' file
user@debian ~ % sed '/Start/,/Stop/d' file 
First line
Last line

คำสั่ง: ทดแทน

คำสั่งที่ใช้เพื่อทำการทดแทนในการเลือกคือ:

  • s: ทดแทนบรรทัดที่ตรงกับที่อยู่ที่ระบุ / ช่วงของที่อยู่;

เมื่อคำสั่งนี้ไม่ได้นำหน้าด้วยที่อยู่ / การเลือกคำสั่งจะถูกดำเนินการทั่วโลกเช่นในแต่ละบรรทัดของไฟล์อินพุต

ไวยากรณ์ของsคำสั่งคือ:

s/<pattern>/<replacement_string>/<pattern_flags>

สแลชคือ "ตัวคั่น" พวกเขาจะใช้เพื่อกำหนดเขต<pattern>, <replacement_string>และ<pattern_flags>ส่วน;

ตัวคั่นจะเป็นอักขระตามsคำสั่งทันที สามารถตั้งค่าเป็นอักขระอื่นได้ตัวอย่างเช่น|:

s|<pattern>|<replacement_string>|<pattern_flags>

<pattern>เป็นนิพจน์ทั่วไปพื้นฐานหรือแบบขยาย <replacement_string>เป็นสตริงคงที่ซึ่งอาจรวมถึง - sedลำดับเฉพาะที่มีความหมายพิเศษ เป็นรายการของธงที่ปรับเปลี่ยนพฤติกรรมของ<pattern_flags><pattern>

sedลำดับ -specific ทั่วไปส่วนใหญ่ที่มีความหมายพิเศษ:

  • &: backreference ถูกแทนที่ด้วยสตริงที่จับคู่ด้วย<pattern>;
  • \<N>(ในกรณีที่<N>เป็นตัวเลข): backreference แทนที่ด้วย<N>กลุ่มบันทึกใน<pattern>;

ธงที่พบมากที่สุด:

  • g: บังคับ<pattern>ให้แข่งขันกันทั่วโลกเช่นหลายครั้งในแต่ละบรรทัด
  • i: กองกำลัง<pattern>เพื่อให้ตรงกับกรณีตาย;
  • p: พิมพ์บรรทัดที่มีการแทนที่อีกครั้ง (มีประโยชน์เมื่อใช้-nสวิตช์ในsedการภาวนาเพื่อพิมพ์เฉพาะบรรทัดที่มีการแทนที่);

ตัวอย่าง: ทดแทน

ไฟล์ตัวอย่าง:

A-well-a everybody's heard about the bird
B-b-b-bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, the bird is the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a don't you know about the bird?
Well, everybody knows that the bird is the word!
A-well-a bird, bird, b-bird's the word
A-well-a...
  • การแทนที่การเกิดขึ้นครั้งแรกของ<pattern>ด้วย<replacement_string>ในแต่ละบรรทัด:
sed 's/<pattern>/<replacement_string>/' file
user@debian ~ % sed 's/bird/birds/' file
A-well-a everybody's heard about the birds
B-b-b-birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, the bird is the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, bird, b-bird's the word
  • การแทนที่การเกิดขึ้นทั้งหมดของ<pattern>ด้วย<replacement_string>ในแต่ละบรรทัด:
sed 's/<pattern>/<replacement_string>/g' file
user@debian ~ % sed 's/bird/birds/g' file
A-well-a everybody's heard about the birds
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, birds, b-birds's the word
A-well-a...
  • การเลือกเฉพาะบรรทัดที่ขึ้นต้นด้วย<pattern1>และแทนที่เหตุการณ์ทั้งหมด<pattern2>ด้วย<replacement_string>:
sed -n '/^<pattern1>/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/^A/s/bird/birds/pg' file
A-well-a everybody's heard about the birds
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
A-well-a birds, birds, b-birds's the word
  • การเลือกเฉพาะบรรทัดที่ลงท้ายด้วย<pattern1>และแทนที่การเกิดขึ้นทั้งหมด<pattern2>ด้วย<replacement_string>:
sed -n '/<pattern1>$/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/word$/s/bird/birds/pg' file
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, b-birds's the word
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.