2017-10-16 5 views
0

En utilisant wget, une page Web est téléchargée en tant que fichier .txt. Ce fichier enregistré est nommé en utilisant une partie de l'URL de la page Web, par exemple. wget http://www.example.com/page/12345/ -O 12345.txt, pour plus de commodité.Utilisez sed find ID dans le fichier txt et utilisez l'ID pour renommer le fichier

Je cours des commandes à partir d'un script shell .sh, car il peut exécuter plusieurs commandes, une ligne à la fois, par exemple. Après le téléchargement d'un fichier, j'utilise sed pour analyser le texte/les caractères que je veux conserver. Une partie du texte que je veux comprend blah blah Product ID a5678. Ce que je veux est d'utiliser sed pour trouver a5678 et l'utiliser pour renommer le fichier 12345.txt en a5678.txt.

# script.sh 
wget http://www.example.com/page/12345/ -O 12345.txt 
sed -i '' 's/pattern/replace/g' 12345.txt 
sed command to find a5678 # in line blah blah Product ID a5678 
some more sed commands 
mv 12345.txt a5678.txt (or use a variable $var.txt)? 

Comment procéder?

Je peux également utiliser ce même ID a5678 et créer un dossier portant le même nom a5678. D'où le fichier .txt est dans le dossier comme si /a5678/a5678.txt.

mkdir a5678 (or mkdir $var)? && cd a5678 

J'ai cherché des réponses pendant une demi-journée, mais n'en trouve aucune. Le plus proche que j'ai trouvé est Find instance of word in files and change it to the filename mais c'est exactement le contraire de ce que je veux. J'ai aussi pensé à utiliser des variables, par exemple. https://askubuntu.com/questions/76808/how-do-i-use-variables-in-a-sed-command mais je ne sais pas comment enregistrer les caractères trouvés en tant que variable.

Nous espérons avoir de l'aide! Je vous remercie! Je suis sur un Mac tournant Sierra.

+0

Sauf si vous êtes caractères _replacing_ dans les fichiers, je pourrais simplement utiliser 'la place grep', couper les résultats pour extraire les chaînes dont j'ai besoin de changement de nom . Ou passer à perl ... – jdv

Répondre

1

En essayant de minimiser, adaptez cela à votre logique.

in=12345.txt 
out=$(grep ' Product ID ' $in | sed 's/.* Product ID \([^ ]*\) .*/\1/') 
mkdir -p $out 
mv $in $out/$out.txt 
+1

un couple de mods que je pourrais suggérer: ajouter un drapeau '-m 1' à' grep' (pour éviter plusieurs correspondances), et ajouter un 'if [$ out]; then' clause autour des commandes 'mkdir' et' mv', donc si la chaîne n'est pas trouvée, vous n'obtenez pas de comportements étranges. – HardcoreHenry

0

Merci à tous! Avec votre inspiration, je résolu mon problème en (sans utiliser grep):

in=12345 
out=$(sed -n '/pattern/ s/.*ID *//p' $in.txt) 
mv $in.txt $out.txt 
cd .. 
mv $in $out 
+0

Et je pense que j'ai enfin compris le combo '-n' -'/p', lol. Merci. :) –