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
คำสั่งทั้งสองจะพิมพ์ด้านบนของสแต็คโดยไม่ต้องผนวก\n
ewline และหลังจากนั้นปรากฏออกของสแต็คการป้อนข้อมูลที่
ดังนั้นการใช้บรรทัดแรกเป็นตัวอย่างdc
จะทำ:
[2015-01 ]P
P
rint และป๊อปอัพด้านบนของสแต็ค
5000
- ดันตัวเลข
5000
ไปที่ด้านบนสุดของสแต็กและดันองค์ประกอบทั้งหมดที่อยู่ในสแต็ก(ตอนนี้ไม่มี)ลงทีละหนึ่ง
1000
- เหมือนกัน แต่คราวนี้หมายเลข 5000 ที่ด้านบนสุดของสแต็กหลักถูกผลักลงหนึ่งและกลายเป็นองค์ประกอบที่สองในสแต็ก
+
- เพิ่มตัวเลขสองอันดับแรกลงบนสแต็กเข้าด้วยกันแล้วนำทั้งสองเหล่านั้นออกจากสแต็กแล้วดันยอดรวมลงบนสุดของสแต็ก
- ซึ่งส่งผลให้สแต็กประกอบด้วยจำนวน
6000
เท่านั้น
- นี้เป็นข้อผิดพลาดทางไวยากรณ์ถ้าทั้งสององค์ประกอบในกองเป็นสตริง
[
]
p
p
รีดด้านบนของสแต็กตามด้วย\n
ewline ที่ต่อท้ายโดยไม่ต้อง popping จากด้านบนของสแต็ก
c