2010-07-26 9 views
1

Existe-t-il une implémentation de scanf() (comme en C) dans awk (POSIX)?scanf, référence arrière dans awk

Je sais que awk n'a pas de référence arrière comme dans sed et perl. Quelle est la manière la plus simple de simuler dans awk?

Merci

Nyan

Répondre

3

sprintf(), printf() peut être ce que vous recherchez. awk ne prend pas en charge les références arrières mais gawk's gensub(), ou même gsub() peut fournir des backreferences.

Les références arrières stockent simplement les chaînes correspondantes. Donc, en utilisant la capacité de awk différencier les champs et les délimiteurs de champ, en utilisant ses variables internes comme BSF, FS, SRO etc sont la voie à suivre .. par exemple

$ echo "test.txt" | sed 's/\(.*\).txt/\1.pdf/' 
test.pdf 

$ echo "test.txt" | awk -F"." '{$NF="pdf"}1' OFS="." 
test.pdf 

Bien sûr, cela est juste un exemple simple. Mais vous avez l'idée.

+0

ya je sais printf famille dans awk. mais scanf ?? – Nyan

+0

vous pouvez utiliser getline pour prendre l'entrée de l'utilisateur, puis utiliser sprintf avec le spécificateur de format approprié et stocker dans la variable – ghostdog74

+1

'gsub' ne fournit pas de références arrières. Pour les obtenir directement, vous devez utiliser l'extension gawk 'gensub' (également disponible dans d'autres awks, comme BusyBox), ou le 3ème argument optionnel de gawk' match'. Vous pouvez * utiliser * 'gsub' pour implémenter la même chose manuellement, ce qui sera plus portable; mais, ce n'est pas un simple interligne. – dubiousjim