AWK - 在正则表达式中删除角色(awk - remove character in regex

2019-10-20 18:41发布

我想删除1awk从这个表达式: ^1[0-9]{10}$如果说正则表达式是在任何领域找到。 我一直在试图使其与工作subsubstr了几个小时,现在,我无法找到这个正确的逻辑。 我已经有解决方案的sed: s/^1\([0-9]\{10\}\)$/\1/ ,我需要做这项工作awk

编辑用于输入和输出的例子。 输入:

10987654321
2310987654321
1098765432123    

(AWK扭曲和过于复杂的语法)

输出:

0987654321
2310987654321
1098765432123    

基本上,导致1时,它的后面十个位数仅需要去除。 第二和第三个例子线是正确的,第二次有23前面1 ,第3拥有国内领先的1 ,但它后面12位数字,而不是十。 这就是正则表达式指定。

Answer 1:

随着sub()你可以尝试:

awk '/^1[0-9]{10}$/ { sub(/^1/, "") }1' file

或用substr()

awk '/^1[0-9]{10}$/ { $0 = substr($0, 2) }1' file

如果你需要测试每一个领域,尝试遍历它们:

awk '{ for(i=1; i<=NF; i++) if ($i ~ /^1[0-9]{10}$/) sub(/^1/, "", $i) }1' file

https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html



Answer 2:

如果GNU AWK可供您,您可以使用gensub功能:

echo '10987654321'|awk '{s=gensub(/^1([0-9]{10})$/,"\\1","g");print s}'
0987654321

编辑:

做到这一点的每一个领域:

awk '{for(i=1;i<=NF;i++)$i=gensub(/^1([0-9]{10})$/,"\\1","g", $i)}7 file

测试:

kent$  echo '10987654321 10987654321'|awk '{for(i=1;i<=NF;i++)$i=gensub(/^1([0-9]{10})$/,"\\1","g", $i)}7'                                                                  
0987654321 0987654321


文章来源: awk - remove character in regex