2017-03-17 38 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 
相關問題