คำตอบนี้เป็นงานที่ทำอยู่ - มันหายไปตัวอย่างมากขึ้นเกี่ยวกับคำสั่ง 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
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
sed '<N>d' file
user@debian ~ % sed '3d' file
line1
line2
line4
line5
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
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.