sed 's/[^ ]* */[&]P/;s//&+pc/3'|dc
... พิมพ์ ...
2015-01 6000
2015-02 8000
2015-03 10000
ดังนั้นฉันข้างต้นประกาศแสดงออกปกติซึ่งกำหนดฟิลด์ขอบเขตที่ประกอบด้วย*ตัวแปรความยาวลำดับเดียวของตัวละครที่^ไม่ได้ <พื้นที่>ตามทันทีโดย*ความยาวตัวแปรลำดับเดียวของตัวละครซึ่งเป็น<พื้นที่> การประกาศนี้ถูกนำไปใช้กับsedพื้นที่รูปแบบของซึ่งเป็นตัวคั่นสตริง(โดยค่าเริ่มต้น)โดยแต่ละ\nตัวอักษร ewline ที่เกิดขึ้นในการป้อนข้อมูลและที่จะถูกแทนที่ซ้ำ(โดยค่าเริ่มต้น)กับต่อไปสำหรับแต่ละเหตุการณ์ที่เกิดขึ้นเหมือนกัน
อินเทอร์เฟซสำหรับการประกาศนี้เป็นสองเท่าและในแต่ละระดับมีการควบคุมอย่างสมบูรณ์และระบุโดยคณะกรรมการมาตรฐาน IEEE อย่างเป็นทางการระหว่างประเทศอย่างน้อยหนึ่ง คณะเพื่อรับรองการใช้sedไวยากรณ์คำสั่ง ตัวอย่างเช่นใช้sedไวยากรณ์ของ APIในกรณีนี้ด้วยคำสั่งที่/อยู่(ซึ่งมักเป็นองค์ประกอบแรกของคำสั่ง ubstitution ใด ๆ)แต่เนื้อหาที่เหมือนกันจะถูกตีความโดย API พื้นฐานเพิ่มเติมเป็นชุดย่อยของที่ระบุไว้สำหรับฟังก์ชั่นในห้องสมุดมาตรฐาน C/sed s///regcomp()
ฉันสามารถทำให้งบการเงินนี้ได้อย่างมั่นใจเพราะsedเป็นไม่เพียงโปรแกรม แต่ค่อนข้างเรียบเรียงชื่อปฏิบัติการsedบนของ Unix เหมือนเครื่องเป็นการดำเนินงานของดีที่กำหนดก่อตั้งขึ้นในอดีตและมาตรฐานการควบคุมsed แอพลิเคชันของ regular- ระบบของฉัน ไลบรารีการจับคู่นิพจน์
จากsedสเป็ค:
sedยูทิลิตี้จะสนับสนุน Bres ที่อธิบายไว้ในนิพจน์ปกติ XBD พื้นฐาน ...
... ที่เราพบ ...
ทั้งสอง Bres และ Eres รับการสนับสนุนจากอินเตอร์เฟซการแสดงออกจับคู่ปกติในปริมาณที่ระบบการเชื่อมต่อของ POSIX.1-2008 ภายใต้regcomp(), regexec()และฟังก์ชั่นที่เกี่ยวข้อง
แอปพลิเคชันที่การโทรregcomp()จะแสดงสตริงรูปแบบและ ...
... [t] regcomp()ฟังก์ชั่นเขาจะรวบรวมการแสดงออกปกติที่มีอยู่ในสตริงที่ชี้ไปตามอาร์กิวเมนต์รูปแบบและวางผลลัพธ์ในโครงสร้างpreg ...
ในการดำเนินการดังกล่าวแอปพลิเคชันดังกล่าวจะอ้างถึงregcomp()ฟังก์ชั่นสหาย ...
... [t] regexec()ฟังก์ชั่นของเขาเปรียบเทียบสตริงที่สิ้นสุดด้วยค่า null ที่ระบุโดยสตริงที่มีการแสดงออกปกติpregรวบรวมที่เริ่มต้นโดยการเรียกก่อนหน้านี้ไปที่regcomp()...
... regexec()จะเติมองค์ประกอบของ [a] array ที่มีการชดเชย substrings ของสตริงที่สอดคล้องกับ\(subexpressions ที่อยู่ในวงเล็บ\)ของรูปแบบ ... patternตัวเองนับเป็น subexpression ...
... [t] เขาregexec()ทำงานต้องกรอกข้อมูลในทุกn ตรงกับองค์ประกอบของpmatchที่n ตรงกับที่และpmatchจัดทำโดยแอพลิเคชันแม้ว่าองค์ประกอบบางส่วนของpmatchไม่ตรงกับ subexpressions ในรูปแบบ
และเมื่อฉัน ...
/[^ ]* */
... sedก่อนจะคอมไพล์นิพจน์ปกติและเก็บผลลัพธ์ไว้ในหน่วยความจำหลังจากนั้นก็ใช้คอมไพล์ออโตเมติกที่เก็บไว้ที่นั่นกับเนื้อหาของ pattern-space ของฉันหลาย ๆ ครั้งตามที่จำเป็นเพื่อทำให้คำสั่งของฉันสำเร็จ เวลามันจะส่งผลให้ทุกคนเป็นอาร์เรย์ของหนึ่งหรือมากกว่าโมฆะคั่นเขตregexec()เป็นที่คั่นที่ชดเชยที่ส่งกลับโดย
และเมื่อฉันทำ ...
//
... เพื่อระบุว่าควรใช้นิพจน์ทั่วไปที่กำหนดไว้ล่าสุดsedเพียงแค่สามารถเรียกregexec()ใช้นิพจน์ปกติที่คอมไพล์แล้วอีกครั้ง แต่อาจใช้ในครั้งนี้กับอาร์กิวเมนต์สตริงที่เปลี่ยนแปลงหรือใช้พารามิเตอร์nmatchใหม่เป็นคำสั่ง I
โดยเฉพาะอย่างยิ่งยังคง ...
s/[^ ]* */[&]P/
- แทนที่การเกิดขึ้นครั้งแรกของรูปแบบในพื้นที่รูปแบบด้วย
[วงเล็บสี่เหลี่ยมด้านซ้ายจากนั้น&ตัวมันเองจากนั้น]วงเล็บเหลี่ยมสี่เหลี่ยมด้านขวาตามด้วยPอักขระ
s//&+pc/3
- สมัครที่ผ่านการแสดงออกปกติมาใช้อีกครั้งกับพื้นที่รูปแบบปัจจุบันและแทนที่
3เกิดขึ้นในสามของรูปแบบในพื้นที่รูปแบบด้วยตัวเองตามด้วยสตริงท้าย&+pc
ดังนั้นสำหรับsedอินพุตแต่ละบรรทัดมันเขียนไปยัง stdout ของมันโดยรับข้อมูลตัวอย่างของคุณ:
[2015-01 ]P5000 1000+pc
[2015-02 ]P6000 2000+pc
[2015-03 ]P7000 3000+pc
นี้อาจดูแปลก แต่dcคำพูดที่เครื่องคิดเลขสตริงในการป้อนข้อมูลระหว่างวงเล็บและPคำสั่งทั้งสองจะพิมพ์ด้านบนของสแต็คโดยไม่ต้องผนวก\newline และหลังจากนั้นปรากฏออกของสแต็คการป้อนข้อมูลที่
ดังนั้นการใช้บรรทัดแรกเป็นตัวอย่างdcจะทำ:
[2015-01 ]P
Print และป๊อปอัพด้านบนของสแต็ค
5000
- ดันตัวเลข
5000ไปที่ด้านบนสุดของสแต็กและดันองค์ประกอบทั้งหมดที่อยู่ในสแต็ก(ตอนนี้ไม่มี)ลงทีละหนึ่ง
1000
- เหมือนกัน แต่คราวนี้หมายเลข 5000 ที่ด้านบนสุดของสแต็กหลักถูกผลักลงหนึ่งและกลายเป็นองค์ประกอบที่สองในสแต็ก
+
- เพิ่มตัวเลขสองอันดับแรกลงบนสแต็กเข้าด้วยกันแล้วนำทั้งสองเหล่านั้นออกจากสแต็กแล้วดันยอดรวมลงบนสุดของสแต็ก
- ซึ่งส่งผลให้สแต็กประกอบด้วยจำนวน
6000เท่านั้น
- นี้เป็นข้อผิดพลาดทางไวยากรณ์ถ้าทั้งสององค์ประกอบในกองเป็นสตริง
[]
p
pรีดด้านบนของสแต็กตามด้วย\newline ที่ต่อท้ายโดยไม่ต้อง popping จากด้านบนของสแต็ก
c