sed 's/[^ ]* */[&]P/;s//&+pc/3'|dc
... bản in ...
2015-01 6000
2015-02 8000
2015-03 10000
Vì vậy, ở trên tôi khai báo một biểu thức chính quy xác định phạm vi trường bao gồm một chuỗi các ký tự có *
độ dài thay đổi ^
không phải là <dấu cách> ngay sau đó là một chuỗi các ký tự có *
độ dài thay đổi là <dấu cách> . Tuyên bố này được áp dụng đối với sed
không gian mẫu của chuỗi, được phân tách bằng chuỗi (theo mặc định) bởi mỗi \n
ký tự ewline xuất hiện trong đầu vào và được thay thế đệ quy (theo mặc định) cho lần xuất hiện tiếp theo cho mỗi lần xuất hiện giống nhau.
Giao diện cho tuyên bố này là hai lần và ở mỗi cấp được quy định và chỉ định đầy đủ bởi ít nhất một ủy ban tiêu chuẩn chính thức của IEEE quốc tế để đảm bảo ứng dụng sed
cú pháp lệnh có thể dự đoán được . Ví dụ, sed
cú pháp API được áp dụng trong trường hợp này bằng lệnh /
địa /
chỉ (luôn là thành phần đầu tiên của bất kỳ sed s///
lệnh ubstlation nào ) , nhưng nội dung tương tự được hiểu bởi một API cơ bản hơn như là một tập hợp con được chỉ định cho regcomp()
chức năng trong thư viện C tiêu chuẩn .
Tôi có thể làm cho các báo cáo một cách tự tin, bởi vì sed
là không chỉ đơn thuần là một chương trình, nhưng, đúng hơn, biên soạn thực thi có tên sed
trên của tôi giống như Unix máy là một thực hiện của rõ ràng, lịch sử thành lập, và các tiêu chuẩn kiểm soát sed
ứng dụng của regular- hệ thống của tôi biểu thức phù hợp với thư viện.
Từ sed
thông số kỹ thuật:
Các sed
tiện ích có trách nhiệm hỗ trợ các BREs được mô tả trong XBD cơ bản Regular Expressions ...
... nơi chúng ta tìm thấy ...
Cả hai BREs và Eres được hỗ trợ bởi giao diện Biểu hiện Matching thường xuyên dưới các khối lượng hệ thống giao diện của POSIX.1-2008 dưới regcomp()
, regexec()
và các chức năng liên quan.
Một ứng dụng gọi regcomp()
sẽ hiển thị cho nó một chuỗi mẫu và ...
... [t] ông regcomp()
hoạt động có trách nhiệm lập các biểu thức chính quy chứa trong chuỗi trỏ đến bởi mô hình lập luận và đặt kết quả trong cơ cấu preg ...
Để hành động, ứng dụng cho biết sau đó sẽ đề cập đến regcomp()
chức năng đồng hành của ...
... [t] ông regexec()
hoạt động so sánh chuỗi null-chấm dứt theo quy định của chuỗi với biểu hiện thường xuyên biên soạn preg khởi tạo bởi một cuộc gọi trước để regcomp()
...
... regexec()
sẽ điền vào các yếu tố của [một] mảng với hiệu số của các chuỗi con của chuỗi đó tương ứng với các \(
subexpressions trong ngoặc đơn \)
của mô hình ... mô hình riêng của mình tính như là một subexpression ...
... [t] ông regexec()
hoạt động phải điền vào tất cả nkhớp yếu tố của pmatch , nơi nkhớp và pmatch được cung cấp bởi các ứng dụng, ngay cả khi một số yếu tố của pmatch không tương ứng với subexpressions trong mô hình .
Và khi tôi làm ...
/[^ ]* */
... sed
trước tiên biên dịch biểu thức chính quy và lưu trữ kết quả vào bộ nhớ, sau đó áp dụng tự động biên dịch được lưu trữ ở đó vào nội dung của không gian mẫu của tôi nhiều lần cần thiết để thực hiện lệnh của tôi. Mỗi lần nó thực hiện kết quả là một mảng các trường được phân tách bằng một hoặc nhiều null được phân định tại các độ lệch được trả về bởi regexec()
.
Và khi tôi làm ...
//
... Để chỉ ra rằng nên sử dụng biểu thức chính quy được xác định gần đây nhất, sed
chỉ có thể gọi regexec()
lại sử dụng lại biểu thức chính được biên dịch trước, nhưng có thể áp dụng lần này cho một đối số chuỗi đã thay đổi hoặc áp dụng các tham số nmatch mới khi tôi ra lệnh.
Cụ thể hơn vẫn là ...
s/[^ ]* */[&]P/
- thay thế sự xuất hiện đầu tiên của mẫu trong không gian mẫu bằng dấu
[
ngoặc vuông bên trái, sau đó &
chính nó, sau đó là dấu ]
ngoặc vuông bên phải theo sau là một P
ký tự.
s//&+pc/3
- áp dụng biểu thức chính quy được sử dụng lần cuối một lần nữa cho không gian mẫu hiện tại và thay thế
3
lần xuất hiện thứ ba của mẫu trong không gian mẫu bằng &
chính chuỗi được nối tiếp +pc
.
Và do đó, đối với mỗi dòng sed
đầu vào, nó ghi vào thiết bị xuất chuẩn của nó, đưa ra dữ liệu mẫu của bạn:
[2015-01 ]P5000 1000+pc
[2015-02 ]P6000 2000+pc
[2015-03 ]P7000 3000+pc
Điều này có thể trông lạ, nhưng dc
máy tính trích dẫn các chuỗi trong đầu vào giữa các dấu ngoặc vuông và P
lệnh sẽ vừa in đỉnh ngăn xếp mà không nối thêm \n
ewline và sau đó bật ra khỏi ngăn xếp đầu vào.
Và vì vậy, sử dụng dòng đầu tiên ở đó làm ví dụ, dc
sẽ làm:
[2015-01 ]P
P
rint và bật đầu ngăn xếp
5000
- Đẩy số
5000
lên trên cùng của ngăn xếp và đẩy tất cả các yếu tố hiện có trên ngăn xếp (bây giờ không có) xuống một.
1000
- ditto, nhưng lần này, số 5000 ở đầu ngăn xếp chính bị đẩy xuống bởi một và trở thành phần tử thứ hai trên ngăn xếp.
+
- Thêm hai số trên cùng của ngăn xếp với nhau, bật cả hai số đó ra khỏi ngăn xếp và đẩy tổng lên trên cùng của ngăn xếp.
- Điều này dẫn đến một ngăn xếp chỉ bao gồm số lượng
6000
.
- Đây là lỗi cú pháp nếu một trong hai phần tử trên cùng của ngăn xếp là một
[
chuỗi ]
.
p
p
rint trên cùng của ngăn xếp theo sau là một \n
ewline được nối thêm mà không bật nó ra khỏi ngăn xếp.
c