我在将sed语法降低到将不同数量的前导零添加到数字组织方案时遇到麻烦。我正在操作的字符串看起来像
1.1.1.1,Some Text Here
利用sed语法
sed -r ":r;s/\b[0-9]{1,$((1))}\b/0&/g;tr"
我能够引起回应
01.01.01.01,Some Text Here
但是,我要寻找的东西是将字段2和3中的2位数字零填充,并将字段4中的3位数字零填充,以使所有项目的标准长度为[0-9]。[0-9] { 2}。[0-9] {2}。[0-9] {3}
1.01.01.001,Some Text Here
为了我的一生,我什至无法想像如何修改边界以包括必要的参数,以便仅在一个句点之后捕捉到数字。我认为这与\ b的使用有关,我理解\ b在单词边界匹配零个字符,但是我不明白为什么我为匹配添加句点的尝试失败如下:
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
此外,如果该语句包含类似以下内容的文本,我希望会遇到其他问题:
1.1.1.1,Some Number 1 Here
我已经需要真正学习sed及其所有复杂性,这已成定局。我正在努力解决这个问题,但是希望这个特殊的声明会在一段时间内继续给我带来麻烦。任何帮助将不胜感激。
编辑:我想出了一种方法...此语句似乎可以满足我的要求,但是必须有一种更优雅的方法来实现。
sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'
同样,如果在文本中出现类似的数字格式,则在语法上也将导致问题……类似于:
1.1.1.1,Some Text Referring to Document XXX Heading 1.2.3
在这种情况下,将导致:
1.01.01.001,Some Text Referring to Document XXX Heading 01.02.03
解决了 谢谢大家的帮助。我最初使用下面接受的答案解决了问题。我已经感觉到将解决方案迁移到Python中,成为利用以下排序的更大解决方案的一部分:
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
(或printf
在Awk中进行呼叫)可能会更简单。
sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'
但是,我很想知道是否有更优雅的方法。