Come sostituire tutte le sottostringhe UTF-8 con codifica percentuale con testo UTF-8 semplice?


9

Ho un file html con molto testo UTF-8 con codifica% negli URL.

Ad esempio "% D1% 80% D0% B5% D1% 81% D1% 83% D1% 80% D1% 81% D1% 8B" sta per "ресурсы" ("risorse" in russo).

Il compito è sostituire tutte queste sottostringhe con testo UTF-8 leggibile.

Per semplificare l'attività possiamo considerare che non vi è alcun altro %utilizzo dei segni nel file. Le cifre delle lettere possono essere sia maiuscole che minuscole.

Ho il sospetto che questo può essere fatto con eleganza sed, perl, awko qualcosa, ma non so come.

Questa applicazione web sembra fare il trucco con il testo incollato lì.

Risposte:


9

Con bash, zsh, GNU echo o alcune implementazioni di ksh su alcuni sistemi, questo può essere decodificato semplicemente echo -edopo aver sostituito tutto %con \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: ресурсы

(Presuppone che la stringa stessa non contenga caratteri di barra rovesciata e non sia una delle opzioni supportate dal echocomando)

Come sottolinea anche @JoshLee, è possibile evitare "l'eco avvertimento" utilizzando direttamente:

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

invece direttamente dietro il primo comando.


Nota che questa soluzione elegante funzionerà con qualsiasi codifica, non solo con UTF-8 (es., Sbarazzati delle codifiche per ~ e altri. Un altro trucco da aggiungere alla mia cassetta degli attrezzi. Grazie!
vonbrand

5

Con perl:

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

O con URI::Escape:

perl -MURI::Escape -pe '$_=uri_unescape$_'

Lo adoro perché posso $_ convogliarlo come
Nemo,

@Nemo, $_qui è perl's $_, non bashs'. In combinazione con l' -popzione, l'espressione perl viene eseguita per ogni record di input (i record vengono letti dai file forniti come argomento o stdin se non viene fornito alcun argomento), con il record corrente memorizzato in $_. Questo è simile a awks' $0.
Stéphane Chazelas,

0

C'è un programma chiamato convmvche può aiutarti.

Basta usare convmv --unescape /some_path/target_file. Farà una corsa a secco.

Dopo aver confermato, utilizzare convmv --notest --unescape /some_path/target_fileper continuare.

La homepage di questo programma è: http://j3e.de/linux/convmv/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.