5 votos

Eliminar caracteres de una cadena a través de Terminal

Mi objetivo principal es poder usar Terminal para convertir

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 encontrando una manera de eliminar el http://t.umblr.com/redirect?z=.

Intenté con 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á consistentemente si la longitud de la cadena nunca cambia, lo que significa que no hay garantía para el 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 como no puedo hacer que | pbcopy funcione, ni podría hacer que outer imprima, no tengo idea de lo que realmente hace.

No sé si hay un script de shell que me permita mantener lo que aparece entre los signos de igual. Según los tutoriales y preguntas que he encontrado, sed parece ser mi mejor opción (si puedo entenderlo) pero parece funcionar para archivos, no para cadenas.

¿Dónde sería un mejor lugar para que yo comience?

5voto

user3439894 Puntos 5883

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 está ocurriendo aquí es que la cadena de URL se coloca entre comillas simples y se utiliza echo para enviarla por tubería | a un programa awk.

Sintaxis de Ejemplo:

echo 'URL' | awk 'BEGIN{FS="=|&"}{gsub(/%3A/, ":")}{gsub(/%2F/, "/")}{print $2}'

2voto

Pinecone Puntos 11

Usando Perl, crea este archivo de texto y llámalo algo como "repetir.pl":

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

Se puede ejecutar desde una terminal como:

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

La salida será:

https://archiveofourown.org/works/1885509

1voto

Si desea utilizar sed:

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

o incluso sin cut y con solo una llamada a sed

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

1voto

Michael Zhou Puntos 167

Aquí tienes un ejemplo usando 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 variable str en un array dividido por el signo igual
  • La segunda función explode() convierte el valor del array str[1] en un array dividido por el signo & sobrescribiendo el array str
  • luego imprime el primer valor del nuevo array str

Otra solución usando pura sintaxis de shell (sin programas externos): ksh, zsh, bash - versiones de OSX 10.6 en adelante

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%\&*}

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X