Tôi gặp khó khăn khi đưa cú pháp sed của mình xuống để thêm một số lượng khác nhau dẫn đầu vào sơ đồ tổ chức số. Các chuỗi tôi đang hoạt động xuất hiện như
1.1.1.1,Some Text Here
tận dụng cú pháp sed
sed -r ":r;s/\b[0-9]{1,$((1))}\b/0&/g;tr"
Tôi có thể gợi ra câu trả lời
01.01.01.01,Some Text Here
Tuy nhiên, điều tôi đang tìm kiếm là thứ gì đó bằng không - điền tối đa 2 chữ số vào các trường 2 và 3 và 3 chữ số trong trường 4 để tất cả các mục có độ dài tiêu chuẩn ở [0-9]. [0-9] { 2}. [0-9] {2}. [0-9] {3}
1.01.01.001,Some Text Here
Đối với cuộc sống của tôi, tôi không thể tìm ra cách sửa đổi ranh giới để bao gồm các tham số cần thiết để chỉ chuyển sang các chữ số sau một khoảng thời gian. Tôi nghĩ rằng nó có liên quan đến việc sử dụng \ b mà tôi hiểu khớp với các ký tự 0 ở ranh giới từ, nhưng tôi không hiểu tại sao những nỗ lực của tôi để thêm một khoảng thời gian vào trận đấu lại thất bại như sau:
sed -r ":r;s/\.\b[0-9]{1,$((1))}\b/0&/g;tr"
sed -r ":r;s/\b\.[0-9]{1,$((1))}\b/0&/g;tr"
Both cause the statement to hang
sed -r ":r;s/\b[0-9]\.{1,$((1))}\b/0&/g;tr"
sed -r ":r;s/\b[0-9]{1,$((1))}\.\b/0&/g;tr"
sed -r ":r;s/\b[0-9]{1,$((1))}\b\./0&/g;tr"
cause the statement to output:
1.01.01.1,Some Text Here
Ngoài ra, tôi hy vọng rằng tôi sẽ có thêm vấn đề nếu câu lệnh chứa văn bản như:
1.1.1.1,Some Number 1 Here
Đó là một kết luận bỏ qua mà tôi cần phải thực sự học về sed và tất cả sự phức tạp của nó. Tôi đang làm việc trên đó, nhưng hy vọng rằng tuyên bố cụ thể này sẽ tiếp tục gây rắc rối cho tôi trong một thời gian. Mọi sự trợ giúp sẽ rất được trân trọng.
EDIT: Tôi đã tìm ra một cách ... Tuyên bố này dường như làm những gì tôi đang tìm kiếm, nhưng phải có một cách thanh lịch hơn để làm điều này.
sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'
Ngoài ra, về mặt cú pháp, điều này sẽ gây ra vấn đề nếu một định dạng số tương tự xuất hiện trong văn bản ... tương tự như:
1.1.1.1,Some Text Referring to Document XXX Heading 1.2.3
Trong trường hợp đó, nó sẽ dẫn đến:
1.01.01.001,Some Text Referring to Document XXX Heading 01.02.03
Đã giải quyết Cảm ơn tất cả sự giúp đỡ của bạn ở đây. Ban đầu tôi đã giải quyết vấn đề bằng câu trả lời tôi chấp nhận dưới đây. Tôi cảm thấy đã chuyển giải pháp sang Python như một phần của giải pháp lớn hơn tận dụng các loại dưới đây:
def getPaddedKey(line):
keyparts = line[0].split(".")
keyparts = map(lambda x: x.rjust(5, '0'), keyparts)
return '.'.join(keyparts)
s=sorted(reader, key=getPaddedKey)
printf
(hoặc một printf
cuộc gọi trong Awk) có thể đơn giản hơn.
sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'
Tuy nhiên, tôi muốn biết liệu có một cách tiếp cận thanh lịch hơn.