我试图将前导零添加到有4位数的邮政编码 - 我需要使用ini
命令,因为这是一些培训的一部分。我的代码似乎一直在失败,但我发现它没有任何问题。
我对Unix / Bash或sed
不太熟悉,所以非常感谢任何有关解释的帮助!
sed
这是运行测试脚本时出现的错误,以确保我的结果正常:
sed -r 's/\<[0-9]{4}\>/0&/'
答案 0 :(得分:1)
如果从echo
或cat
等命令传递stdin输出,它应该可以工作。
echo '4121' | sed -r 's/[0-9]{4}/0&/' # Output: 04121
echo 'h3llo41world' | sed -r 's/[0-9]{4}/0&/' # Output: h3llo41world
echo 'h3llo4121world' | sed -r 's/[0-9]{4}/0&/' # Output: h3llo04121world
echo '1341' | sed -r 's/\<[0-9]{4}\>/0&/' # Output: 01341
echo 'a1341' | sed -r 's/\<[0-9]{4}\>/0&/' # Output: a1341
-r
表示扩展正则表达式。
[0-9]{4}
表示您在字符串中找到四位数字
0&
表示添加零并将&符号&
替换为您在左侧找到的匹配项。
\<
和\>
是字边界条件。因此,在上面的示例4中,正则表达式匹配,但在示例5中,正则表达式不匹配。
答案 1 :(得分:1)
我认为您打算使用\(
和\)
来捕获匹配的部分,而不是\<
和\>
。由于您只有一个匹配的部分,&
就足够了。
让sed
更具弹性更好 - 当邮政编码已有5位数时,它不应该行为不端:
echo 95014 | sed -E 's/^[0-9]{4}$/0&/' => 95014
echo 5014 | sed -E 's/^[0-9]{4}$/0&/' => 05014
上面的sed
表达式查找只有4位的字符串,因为我们使用了^
(字符串的开头)和$
(字符串的结尾)锚点。
上述sed
命令的限制是,只有当您的字符串有4位数时,它才会执行0
填充。您需要添加其他表达式来处理3位,2位和1位邮政编码的情况。