我在降低 sed 语法以将不同数量的前导零添加到数字组织方案时遇到了麻烦。我正在操作的字符串看起来像
1.1.1.1,Some Text Here
Run Code Online (Sandbox Code Playgroud)
利用 sed 语法
sed -r ":r;s/\b[0-9]{1,$((1))}\b/0&/g;tr"
Run Code Online (Sandbox Code Playgroud)
我能够引起反应
01.01.01.01,Some Text Here
Run Code Online (Sandbox Code Playgroud)
但是,我正在寻找的是将字段 2 和 3 中的最多 2 位数字和字段 4 中的 3 位数字填零,以便所有项目在 [0-9].[0-9]{ 处具有标准长度。 2}.[0-9]{2}.[0-9]{3}
1.01.01.001,Some Text Here
Run Code Online (Sandbox Code Playgroud)
在我的一生中,我什至无法弄清楚如何修改边界以包含仅捕捉到句点后的数字所必需的参数。我认为这与使用 \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
Run Code Online (Sandbox Code Playgroud)
此外,如果语句包含以下文本,我希望我会遇到其他问题:
1.1.1.1,Some Number 1 Here
Run Code Online (Sandbox Code Playgroud)
众所周知,我需要真正学习 sed 及其所有复杂性。我正在努力解决这个问题,但预计这个特殊的声明会继续给我带来一段时间的麻烦。任何帮助将不胜感激。
编辑:我想出了一种方法......这个语句似乎做我正在寻找的东西,但必须有一种更优雅的方式来做到这一点。
sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'
Run Code Online (Sandbox Code Playgroud)
此外,如果文本中出现类似的数字格式,这在语法上会导致问题......类似于:
1.1.1.1,Some Text …
Run Code Online (Sandbox Code Playgroud)