我想删除1
与awk
从这个表达式: ^1[0-9]{10}$
如果说正则表达式是在任何领域找到。 我一直在试图使其与工作sub
或substr
了几个小时,现在,我无法找到这个正确的逻辑。 我已经有解决方案的sed: s/^1\([0-9]\{10\}\)$/\1/
,我需要做这项工作awk
。
编辑用于输入和输出的例子。 输入:
10987654321
2310987654321
1098765432123
(AWK扭曲和过于复杂的语法)
输出:
0987654321
2310987654321
1098765432123
基本上,导致1
时,它的后面十个位数仅需要去除。 第二和第三个例子线是正确的,第二次有23
前面1
,第3拥有国内领先的1
,但它后面12位数字,而不是十。 这就是正则表达式指定。
随着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
如果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