sed:将前导零添加到邮政编码

时间:2017-02-08 00:25:29

标签: regex sed

我试图将前导零添加到有4位数的邮政编码 - 我需要使用ini命令,因为这是一些培训的一部分。我的代码似乎一直在失败,但我发现它没有任何问题。

我对Unix / Bash或sed不太熟悉,所以非常感谢任何有关解释的帮助!

sed

这是运行测试脚本时出现的错误,以确保我的结果正常:

sed -r 's/\<[0-9]{4}\>/0&/'

2 个答案:

答案 0 :(得分:1)

如果从echocat等命令传递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位邮政编码的情况。