Eliminando caracteres de una cadena a través de Terminal

5

Mi objetivo principal es poder usar Terminal para girar

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

en

https://archiveofourown.org/works/1885509

Pensé que un buen lugar para comenzar sería encontrar una manera de eliminar http://t.umblr.com/redirect?z= .

Probé tr -d ; sin embargo, no parece haber una forma de eliminar solo la primera instancia de un grupo de caracteres.

Lo siguiente (usando cut ) solo funcionará de manera consistente si la longitud de la cadena nunca cambia, lo que significa que no hay garantía de uso futuro.

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

Esto parecía prometedor:

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

Pero debido a que no puedo hacer que | pbcopy funcione, no pude obtener una copia externa para imprimir, tengo una idea de lo que realmente hace.

No sé si hay shell script que me permita mantener lo que aparece entre los signos iguales. De los tutoriales y las preguntas que he encontrado, sed parece que sería mi mejor opción (si puedo averiguarlo) pero parece funcionar para archivos, no cadenas.

¿Dónde es un mejor lugar para comenzar?

    
pregunta 345422 29.07.2016 - 03:24

4 respuestas

5

Esto parece funcionar:

$ 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
$

Lo que sucede aquí es que la URL cadena se coloca entre comillas simples y al utilizar echo se canaliza | en un programa awk .

Sintaxis de ejemplo:

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

Utilizando Perl, crea este archivo de texto y asígnele el nombre "redo.pl":

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

Se puede ejecutar desde un terminal como:

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

La salida será:

https://archiveofourown.org/works/1885509
    
respondido por el Pinecone 04.08.2016 - 20:47
1

Si quieres usar sed :

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

o incluso sin cut y solo una llamada a sed

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

Aquí hay un ejemplo que usa php y su función urldecode()

echo 'URL' | php -r '$str = urldecode(fgets(STDIN));
$str = explode("=", $str);
$str = explode("&", $str[1]);
printf("%s\n", $str[0]);'
  • la función urldecode() decodifica cualquier codificación% ##
  • la función explode() convierte la var str en una matriz dividida en el signo igual
  • La segunda función explode() convierte el valor de la matriz str [1] en una división de matriz en el & signo sobrescribiendo la matriz str
  • luego imprime el primer valor de la nueva matriz str

Otra solución que utiliza sintaxis de shell pura (sin programas externos): ksh, zsh, bash-OSX 10.6 y versiones superiores

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%\&*}
    
respondido por el fd0 29.07.2016 - 15:48

Lea otras preguntas en las etiquetas