2017-10-19 45 views
0

C'est une tâche un peu plus simple qui me dérange depuis un certain temps. Je donne les résultats suivants:XMLStarlet remove last -n (nouvelle ligne) en utilisant Sed

homepage=$(curl "https://example.com/") 

xmlstarlet --quiet fo --html <<<"$homepage" | 
xmlstarlet sel -T -t \ 
    -m "//*[@id='financial']/tbody/tr/td" \ 
     --if 'not(starts-with(a//@href,"http"))' \ 
      -o 'https://example.com' \ 
     --break \ 
     -v 'a//@href' \ 
     -o '/?start=1' \ 
     -o '&' \ 
     -o 'end=2' -n | \ 
      sed '${/^$/d;}' \ 
       >> "results.txt" 

Ce que je veux faire est de retirer la dernière produit par saut de ligne xmlstarlet dans -o 'end=2' -n | \. Quand il atteint la fin si la liste des liens, il produit toujours un -n (saut de ligne) comme si il devait continuer à ajouter plus de liens, mais en fait je veux éviter la dernière -n instance respective à la dernière href.

Mon sed '${/^$/d;}' \ qui devrait faire retourne l'erreur suivante:

sed: ${/^$/d;}: No such file or directory 
sed: : No such file or directory 

Il ne conduit pas en quelque sorte le STDOUT avant la sedSTDIN correctement. Dans l'un de mes avant questions je travaillais avec quelque chose de similaire et cette commande sed a fonctionné pour moi plus tôt:

sed 's/\\&amp;/\&/g' 

D'autre part, j'ai aussi essayé d'utiliser:

# The -e flag 
sed -e '${/^$/d;}' 

Ce qui ne fonctionne pas pour moi non plus.

Est-ce que cela peut être fait directement à partir de XMLStarlet sans avoir à ajouter un tuyau supplémentaire sed?

Quel est le problème avec mon sed? Quelle est la bonne méthode sed?

+1

Supprimer tous les espaces après \ – Cyrus

+0

Bonjour @Cyrus Je ne comprends pas complètement. D'après cette [question] (https://stackoverflow.com/questions/369758/how-to-trim-whitespace-from-a-bash-variable), j'ai trouvé que 'sed -e 's/[[: space: ]] * $ // ''devrait supprimer l'espace de fin. Cependant, cela ne supprime pas le ** newline ** après la dernière URL. Pourriez-vous peut-être donner un exemple? –

+1

Votre code contient ces deux lignes: '-o 'end = 2' -n | \ 'et' sed '$ {/^$/d;}' \ '. Les deux contiennent un espace après le \. Supprimez ces espaces. – Cyrus

Répondre

0

Placer ceci à la fin du script a fonctionné pour moi:

printf "%s" "$(</results.txt)" > results.txt 

Je cherchais le faire directement dans xmlstarlet, c'est donc une réponse provisoire.