Rimozione di caratteri da una stringa tramite Terminale

5

Il mio obiettivo principale è quello di poter usare il terminale per girare

http://t.umblr.com/redirect?z=https%3A%2F%2Farchiveofourown.org%2Fworks%2F1885509&t=N2M3YmNhNjQzODU5MjI2NmE5ZjljY2Y4NWVhOTVhM2IwYzgyYzYyYixLOHhQakVRbA%3D%3D

in

https://archiveofourown.org/works/1885509

Ho pensato che un buon punto di partenza sarebbe stato trovare un modo per rimuovere http://t.umblr.com/redirect?z= .

Ho provato tr -d ; tuttavia, non sembra esserci un modo per rimuovere solo la prima istanza di un gruppo di caratteri.

Quanto segue (usando cut ) funzionerà in modo coerente solo se la lunghezza della stringa non cambia mai, il che significa che non vi è alcuna garanzia per l'uso futuro.

 echo 'http://t.umblr.com/redirect?z=https%3A%2F%2Farchiveofourown.org%2Fworks%2F1885509&t=N2M3YmNhNjQzODU5MjI2NmE5ZjljY2Y4NWVhOTVhM2IwYzgyYzYyYixLOHhQakVRbA%3D%3D' | cut -c31-83

Sembrava promettente:

 var="http://t.umblr.com/redirect?z=https%3A%2F%2Farchiveofourown.org%2Fworks%2F1885509&t=N2M3YmNhNjQzODU5MjI2NmE5ZjljY2Y4NWVhOTVhM2IwYzgyYzYyYixLOHhQakVRbA%3D%3D" | var=${var:30} 

Ma poiché non riesco a ottenere | pbcopy per funzionare, non riesco a ottenere un risultato esterno per la stampa, ho un'idea di ciò che effettivamente fa.

Non so se c'è uno script di shell che mi consenta di mantenere ciò che appare tra i segni di uguale. Dalle esercitazioni e dalle domande che ho trovato, sed sembra che sarebbe la mia migliore opzione (se riesco a capirlo) ma sembra funzionare per i file, non per le stringhe.

Dove è il posto migliore dove iniziare?

    
posta 345422 29.07.2016 - 03:24
fonte

4 risposte

5

Questo sembra funzionare:

$ echo 'http://t.umblr.com/redirect?z=https%3A%2F%2Farchiveofourown.org%2Fworks%2F1885509&t=N2M3YmNhNjQzODU5MjI2NmE5ZjljY2Y4NWVhOTVhM2IwYzgyYzYyYixLOHhQakVRbA%3D%3D' | awk 'BEGIN{FS="=|&"}{gsub(/%3A/, ":")}{gsub(/%2F/, "/")}{print $2}'
https://archiveofourown.org/works/1885509
$

Quello che succede qui è l'URL string posto tra virgolette singole e usando echo è convogliato | in un awk programma .

Sintassi di esempio:

echo 'URL' | awk 'BEGIN{FS="=|&"}{gsub(/%3A/, ":")}{gsub(/%2F/, "/")}{print $2}'
    
risposta data 29.07.2016 - 05:19
fonte
2

Usando Perl, crea questo file di testo e chiamalo qualcosa come "redo.pl":

my $url = $ARGV[0];
$url =~ s/%3A/:/g;
$url =~ s/%2F/\//g;
$url =~ /=\K(.*)(?=&)/;
print $1;

Può essere eseguito da un terminale come:

 perl redo.pl http://t.umblr.com...

L'output sarà:

https://archiveofourown.org/works/1885509
    
risposta data 04.08.2016 - 20:47
fonte
1

Se si desidera utilizzare sed :

echo 'URL' | cut -d = -f 2 | sed -e 's|\%3A|:|g' -e 's|\%2F|/|g'

o anche senza cut e solo una chiamata a sed

echo 'URL' | sed -e 's|.*z=\(.*\)\&.*||' -e 's|\%3A|:|g' -e 's|\%2F|/|g'
    
risposta data 29.07.2016 - 08:12
fonte
1

Ecco un esempio utilizzando php ed è urldecode() funzione

echo 'URL' | php -r '$str = urldecode(fgets(STDIN));
$str = explode("=", $str);
$str = explode("&", $str[1]);
printf("%s\n", $str[0]);'
  • la funzione urldecode() decodifica qualsiasi codifica% ##
  • la funzione explode() trasforma la variabile var in una divisione di matrice sul segno di uguale
  • La seconda funzione explode() trasforma il valore dell'array str [1] in una divisione dell'array sul & firmare la sovrascrittura dell'array str
  • quindi stampa il primo valore del nuovo array str

Un'altra soluzione che utilizza la pura sintassi della shell (nessun programma esterno): ksh, zsh, bash- OSX 10.6 e versioni successive

url='http://t.umblr.com/redirect?z=https%3A%2F%2Farchiveofourown.org%2Fworks%2F1885509&t=N2M3YmNhNjQzODU5MjI2NmE5ZjljY2Y4NWVhOTVhM2IwYzgyYzYyYixLOHhQakVRbA%3D%3D'
nurl=${url//\%2F//}; nurl=${nurl//\%3A/:}
nurl=${nurl%=*}; nurl=${nurl#*=}
echo ${nurl%\&*}
    
risposta data 29.07.2016 - 15:48
fonte

Leggi altre domande sui tag