2017-03-17 4 views
-2

Ich versuche, awk zu verwenden, um nach einer Zahlenzeichenfolge zwischen 1 und 65535 zu suchen und ein * daran anzufügen. Hier ist, was ich versuche:Suchen Sie einen Wert und hängen Sie ihn in awk an

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

Wenn ich den Befehl ausführen, ich habe nicht ein Stern sehen in der Datei die Anzahl Zeichenfolge hinzugefügt.

Nach Anfügen des Sternes auf den Wert möchte ich einen Stern auf den Wert vorangestellt wird:

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

Ihre Frage nicht klar ist, bitten Sie müssen Eingabebeispiel umfassen und erwartete Ausgabe –

Antwort

0

Die Frage ist nicht klar (zum Beispiel, ob es ist negative Zahlen im Eingabetext) zeige ich eine gnu-awk Lösung FPAT für spliting von Inhalt

Katze Datei

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

Run es,

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 

Sie erhalten,

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

Ein regulärer Ausdruck, 1-65535 passt wäre so etwas wie:

[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] 

Überlegen und, bis Sie mit dem spielen nageln Sie es genau auf, wenn Sie wirklich die Regexp-Route gehen wollen. Wenn Sie eine prägnante, testbare Beispieleingabe und die erwartete Ausgabe veröffentlichen, können wir Ihnen helfen, einen besseren Ansatz zu finden.

+0

[1,65535] {1 , 5} ist eine Hölle viel einfacher –

+1

'[1.65535] {1,5}' bedeutet die Zeichen 1,3,5,6 oder. 1 bis 5 mal wiederholt. So würden '66666' und' .' (eine einzelne Periode) beide übereinstimmen, während '20' nicht stimmen würde - d.h. es ist nicht im entferntesten, wonach Sie gefragt haben. –

0

prüfen separat jedes Wort und wenn es eine Zahl und zwischen 1-65535 append * es:

$ 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 
Verwandte Themen