2010-09-16 16 views
8

Bazı metni urldecode için awk kullanıyorum.Awl printf urldecode metnini kullanma

printf "%s", "\x3D" gibi printf deyimine dize kodu = doğru olarak gönderir. Değişken olarak tüm katar dizgiye sahip olsaydım aynı. Sadece 3D varsa

Ancak, nasıl \x böylece printf= değil \x3D yazdırır ekleyebilirsiniz?

busybox awk 1.4.2 ve ash kabuğunu kullanıyorum.

cevap

1

, ben tahmin ediyorum ki bunu da olabilir gawk var. gawk veya busybox awk kullanarak Benim için

, ikinci örnek (I "=" hem aldığım) I (--posix seçeneğini kullanmadığınız sürece bu durumda ben için "X3D" olsun ilk olarak aynı şekilde çalışır her ikisi de).

--non-decimal-data veya --traditionalgawk ile kullanırsam, "=" alırım.

Hangi AWK sürümünü kullanıyorsunuz (, nawk, gawk, meşgul kutusu - ve sürüm numarası)?

Düzenleme:

Sıfır mı ekleyerek sayısal birine değişkenin dize değerini zorlamak olabilir

: Bu bölme işlevinin gnu awk uzantısı dayanır

~/busybox/awk 'BEGIN { string="3D"; pre="0x"; hex=pre string; printf "%c", hex+0}' 
+0

Doğru değil, işe yarıyor. Yanlış soruyu sordum - değiştireceğim. (Ben busybox awk, sürüm 1.4.2 kullanıyorum) – Johan

+0

@Johan: Benim düzenlemeye bakın. –

+0

Bu one-liner'ın sadece __one__ değişken için olduğunu, tüm urlen kodlanmış dizgiyi (örneğin, '% 20' ve '% 3F' şeyleri ile doldurulmuş bir web adresi) elde etmek için oldukça uzun bir süre kullandım. – syntaxerror

3

awk bunu nasıl bilmiyorum ama perl'de Önemsiz: Eğer kül kullanıyorsanız ve Perl mevcut olmadığından

echo "http://example.com/?q=foo%3Dbar" | 
    perl -pe 's/\+/ /g; s/%([0-9a-f]{2})/chr(hex($1))/eig' 
+0

Teşekkürler, ancak perl mevcut değil. – Johan

+0

@zwol Bu, sadece bir + ters eğik çizgi ile kaçarsanız Perl 5 üzerinde çalışır! BTW, 's/\ +// g' kısmı olmadan örnek URL'lerle benim için iyi çalışıyor! İkinci regex zaten hile yapacak. – syntaxerror

+0

@syntaxerror Kaçınılması gereken, + bunu nasıl özlediğimi bilmiyorum. Ben şunu yazmıştım, ama + + + + işaretinin notasyonu daha az yaygınlaşıyor, ama yine de [uygulama/x-www-form-urlencoded] özelliğinin bir parçası (http: // www.w3.org/TR/html401/interact/forms.html#h-17.13.4) form gönderimlerinden kaçınıyor. – zwol

0

ama bu işleri:

gawk '{ numElems = split($0, arr, /%../, seps); 
     outStr = "" 
     for (i = 1; i <= numElems - 1; i++) { 
      outStr = outStr arr[i] 
      outStr = outStr sprintf("%c", strtonum("0x" substr(seps[i],2))) 
     } 
     outStr = outStr arr[i] 
     print outStr 
     }' 
2

GNU awk

#!/usr/bin/awk -fn 
@include "ord" 
BEGIN { 
    RS = "%.." 
} 
{ 
    printf RT ? $0 chr("0x" substr(RT, 2)) : $0 
} 

Ya

#!/bin/sh 
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%.. 

Decoding URL encoding (percent encoding)

+2

Bu garnitenler örn. UTF-8 kodlu ASCII olmayan karakterler –

0

Başlangıç ​​olarak, ben bu eski bir soru ama cevapların hiçbiri (busybox awk ile sınırlı)

İki benim için çalıştı farkındayım seçenekler. Stdin ayrıştırmak için:

awk '{for (y=0;y<127;y++) if (y!=37) gsub(sprintf("%%%02x|%%%02X",y,y), y==38 ? "\\&" : sprintf("%c", y));gsub(/%25/, "%");print}' 

bir komut satırı parametresi alması için: Aksi% 253D gibi dizeleri çift çözümlenen olsun, çünkü

awk 'BEGIN {for (y=0;y<127;y++) if (y!=37) gsub(sprintf("%%%02x|%%%02X",y,y), y==38 ? "\\&" : sprintf("%c", y), ARGV[1]);gsub(/%25/, "%", ARGV[1]);print ARGV[1]}' parameter 

son% 25 yapmak zorunda, olmamalı hangi.

y == 38 için satır içi denetimi, gsub'un ters eğik çizgi yapmadığınız sürece özel bir karakter olarak & davranmasıdır.