2017-03-17 43 views
-2

我想用awk搜索1到65535之间的数字字符串,并在其中附加*。这是我正在尝试:找到一个值并将其附加到awk中

awk '/[1-65535]+$/ {$0=$0"*"} 1' file 

当我运行该命令时,我看不到星号被添加到文件中的数字字符串。

追加星号的值后,我要在前面加上一个星号的值:

awk '/1-65535]\* +$/ [$0="*"$0} 1' file 
+1

你的问题不清楚,请你必须包括例如输入和预期输出 –

回答

0

的问题是不明确(例如,是否有在输入文本负数) ,我显示了使用FPAT为劈裂的内容gnu-awk解决方案

猫文件

 
1agauga 1 
65535 9gagayg aha hdhduhd6 65536 
5 
813 0 shshsi616agauga1 

运行它,

awk 'BEGIN{FPAT="[^0-9]+|[0-9]+"}{ 
    for(i=1; i<=NF; ++i) { 
     if($i~/^[0-9]+$/ && $i>=1 && $i<=65535) $i=$i"*" 
     printf "%s%s",$i,(i==NF?ORS:"") 
    } 
}' file 

你,

 
1*agauga 1* 
65535* 9*gagayg aha hdhduhd6* 65536 
5* 
813* 0 shshsi616*agauga1* 
1

匹配1-65535会是这样的一个正则表达式:

[1-5]?[0-9]{4}|6[1-4][0-9]{3}|65[1-4][0-9]{2}|655[1-2][0-9]|6553[1-5] 

思考和与玩到你如果你真的想要去正则表达式路线,就可以精确地记下它。如果/当您发布简明,可测试的样本输入和期望的输出,那么我们可以帮助您找出更好的方法。

+0

[1.65535] {1 ,5}是一个更容易的地狱 –

+1

''[1.65535] {1,5}'意味着字符1,3,5,6或。重复1至5次。所以'66666'和'.'(一个时期)都会匹配,而'20'不会 - 也就是说,它不是您要求的。 –

0

分别检查每一个字,如果它是一个数字,它1-65535追加*之间:

$ cat foo 
d foo 1 bar2 asd 100000 cash 
ding dong 300 pork -5 this1 
$ awk '{for(i=1;i<=NF;i++) if($i~/^[0-9]+$/ && $i>0 && $i<65536) $i=$i "*"}1' foo 
d foo 1* bar2 asd 100000 cash 
ding dong 300* pork -5 this1 
相关问题