Algo parecido com isto?
grep 'URL' file.php | rev | cut -d "'" -f 2 | rev
ou
grep 'URL' file.php | cut -d "'" -f 4 | sed s/'http:\/\/'/''/g
Para remover http: //.
Eu tenho um arquivo que consiste em um URL . Estou tentando obter a URL desse arquivo usando um script de shell.
No arquivo, o URL é assim:
('URL', 'http://url.com');
Eu tentei usar o seguinte:
cat file.php | grep 'URL' | awk '{ print }'
Ele fornece a saída como:
'http://url.com');
Mas eu preciso obter apenas url.com
em uma variável dentro do script de shell. Como posso conseguir isso?
Algo parecido com isto?
grep 'URL' file.php | rev | cut -d "'" -f 2 | rev
ou
grep 'URL' file.php | cut -d "'" -f 4 | sed s/'http:\/\/'/''/g
Para remover http: //.
Você pode fazer tudo com um simples grep
:
grep -oP "http://\K[^']+" file.php
De man grep
:
-P, --perl-regexp
Interpret PATTERN as a Perl regular expression (PCRE, see
below). This is highly experimental and grep -P may warn of
unimplemented features.
-o, --only-matching
Print only the matched (non-empty) parts of a matching line,
with each such part on a separate output line.
O truque é usar \K
, que, em regex Perl, significa discard everything matched to the left of the \K
. Assim, a expressão regular procura por strings começando com http://
(que é então descartado por causa do \K
) seguido por tantos caracteres que não são '
. Combinado com -o
, isso significa que somente a URL será impressa.
Você também pode fazer isso diretamente em Perl:
perl -ne "print if s/.*http:\/\/(.+)\'.*/$1/" file.php\
Tente isso,
awk -F// '{print }' file.php | cut -d "'" -f 1
Revisitando isso novamente e tentando usar nada além de um shell Bash, outra solução de uma linha é:
while read url; do url="${url##*/}" && echo "${url%%\'*}"; done < file.in > file.out
Onde file.in contém a lista de URLs 'dirty' e file.out conterá a lista de URLs 'limpa'. Não há dependências externas e não há necessidade de gerar novos processos ou subpainhas. A explicação original e um roteiro mais flexível segue. Há um bom resumo do método aqui , veja o exemplo 10-10. Esta é a substituição de parâmetros baseada em padrões no Bash.
Expandindo a ideia:
src="define('URL', 'http://url.com');"
src="${src##*/}" # remove the longest string before and including /
echo "${src%%\'*}" # remove the longest string after and including '
Resultado:
url.com
Não há necessidade de chamar programas externos. Além disso, o seguinte script bash, get_urls.sh
, permite que você leia um arquivo diretamente ou de stdin:
#!/usr/bin/env bash
# usage:
# ./get_urls.sh 'file.in'
# grep 'URL' 'file.in' | ./get_urls.sh
# assumptions:
# there is not more than one url per line of text.
# the url of interest is a simple one.
# begin get_urls.sh
# get_url 'string'
function get_url(){
local src=""
src="${src##*/}" # remove the longest string before and including /
echo "${src%%\'*}" # remove the longest string after and including '
}
# read each line.
while read line
do
echo "$(get_url "$line")"
done < "${1:-/proc/${$}/fd/0}"
# end get_urls.sh
Se todas as linhas contiverem um URL:
awk -F"'|http://" '{print }' file.php
Se apenas algumas linhas contiverem um URL:
awk -F"'|http://" '/^define/ {print }' file.php
Dependendo das outras linhas, pode ser necessário alterar o ^define
regex
Simples:
php -r 'include("file.php"); echo URL;'
e se você precisar remover o 'http: //', então:
php -r 'include("file.php"); echo URL;' | sed 's!^http://\(.*\)!!'
Então:
myURL=$(php -r 'include("file.php"); echo URL;' | sed 's!^http://\(.*\)!!')
Se você precisar de uma determinada parte da URL que precisa para refinar sua terminologia, uma URL é todas das seguintes, algumas vezes mais:
URL := protocol://FQDN[/path][?arguments]
FQDN := [hostname.]domain.tld
para mim, o outro grep
responde com informações de string de retorno após o link.
Isso funcionou para eu apenas extrair o url
:
egrep -o "(http(s)?://){1}[^'\"]+"