Wie ersetze ich alle prozentual codierten UTF-8-Teilzeichenfolgen durch einfachen UTF-8-Text?

9

Ich habe eine HTML-Datei mit viel% -codiertem UTF-8-Text in URLs.

Zum Beispiel steht "% D1% 80% D0% B5% D1% 81% D1% 83% D1% 80% D1% 81% D1% 8B" für "ресурсы" ("Ressourcen" auf Russisch).

Die Aufgabe besteht darin, alle diese Teilzeichenfolgen durch lesbaren UTF-8-Text zu ersetzen.

Um die Aufgabe zu vereinfachen, können wir berücksichtigen, dass %die Datei keine andere Zeichenverwendung enthält. Buchstaben können sowohl in Groß- als auch in Kleinbuchstaben geschrieben werden.

Ich vermute, dass dies elegant gemacht sedwerden perlkann awkoder so, aber ich weiß nicht wie.

Diese Webanwendung scheint den Trick mit Text zu machen, den Sie dort einfügen.

Ivan
quelle

Antworten:

9

Mit bash, zsh, GNU echo oder einigen Implementierungen von ksh auf einigen Systemen kann dies einfach dekodiert werden, echo -eindem alle %durch ersetzt werden \x.

url_encoded_string="%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B"
temp_string=${url_encoded_string//%/\\x}

printf '%s\n' "$temp_string"
# output: \xD1\x80\xD0\xB5\xD1\x81\xD1\x83\xD1\x80\xD1\x81\xD1\x8B

echo -e "$temp_string"
# output: ресурсы

(Es wird davon ausgegangen, dass die Zeichenfolge selbst keine Backslash-Zeichen enthält und keine der von Ihrem echoBefehl unterstützten Optionen ist. )

Wie @JoshLee ebenfalls betont, kann die "Echo-Einschränkung" vermieden werden, indem direkt verwendet wird:

printf ${url_encoded_string//%/\\x}

stattdessen direkt hinter dem ersten Befehl.

LiuYan 刘 研
quelle
Beachten Sie, dass diese elegante Lösung mit jeder Codierung funktioniert , nicht nur mit UTF-8 (dh
entfernen Sie
5

Mit Perl:

perl -pe 's/%([0-9A-F]{2})/pack"H2",$1/gei'

Oder mit URI::Escape:

perl -MURI::Escape -pe '$_=uri_unescape$_'
Stéphane Chazelas
quelle
Ich liebe das, weil ich es dank $_ gnu.org/software/bash/manual/html_node/Special-Parameters.html
Nemo
@Nemo, $_hier ist perl's $_, nicht bash' s. In Kombination mit der -pOption wird der Perl-Ausdruck für jeden Eingabedatensatz ausgeführt (Datensätze werden aus Dateien gelesen, die als Argument oder Standard angegeben sind, wenn kein Argument angegeben ist), wobei der aktuelle Datensatz in gespeichert wird $_. Das ist ähnlich wie awk‚s $0.
Stéphane Chazelas
0

Es gibt ein Programm namens, convmvdas Ihnen helfen kann.

Einfach benutzen convmv --unescape /some_path/target_file. Es wird ein Trockenlauf gemacht.

Sobald Sie bestätigt haben, verwenden Sie, um convmv --notest --unescape /some_path/target_filefortzufahren.

Die Homepage dieses Programms lautet: http://j3e.de/linux/convmv/

Star Brilliant
quelle