É um pouco mais complexo do que você está tentando fazer.
Primeiro, existem alguns problemas de sintaxe no seu comando. Este curl www.hackthissite.org: grep "<head> > ~/data/public/myfirstname\ mylastname/head.txt
deve ser:
curl www.hackthissite.org | grep "<head>" > ~/data/public/myfirstname\ mylastname/head.txt
Mas mesmo assim não faria o que você quer, porque você está apenas ganhando a tag de abertura da cabeça, mas não o que fica entre ela e a tag de fechamento.
Eu inventei isso:
curl www.hackthissite.org > TEMPORARYFILE.txt; grep -A $(($(grep -n "</head>" TEMPORARYFILE.txt | cut -d: -f1) - $(grep -n "<head>" TEMPORARYFILE.txt | cut -d: -f1))) "<head>" TEMPORARYFILE.txt > ~/data/public/myfirstname\ mylastname/head.txt; rm TEMPORARYFILE.txt
Então, por partes:
grep -n "</head>" TEMPORARYFILE.txt | cut -d: -f1
Isto irá obter o número da linha onde está a tag de fechamento. O mesmo se aplica a grep -n "<head>" TEMPORARYFILE.txt | cut -d: -f1
, mas para a tag de abertura.
Em seguida, temos $(($(grep -n "</head>" TEMPORARYFILE.txt | cut -d: -f1) - $(grep -n "<head>" TEMPORARYFILE.txt | cut -d: -f1)))
, que deve calcular quantas linhas existem entre a tag de abertura e a tag de fechamento.
Isso é usado com a opção -A
de grep
, o que nos dá o controle de quantas linhas depois da correspondência queremos imprimir. Então, ele procurará pela tag de abertura e imprimirá todas as linhas entre ela e a tag de fechamento.