2016-07-28 11 views
-1

Ich habe ein Python-Skript, das URLs aus pastebin.com/archive zieht, die Links zu Pasten haben (die nach pastbin.com in der URL acht zufällige Ziffern haben). Meine aktuelle Ausgabe ist eine .txt mit den folgenden Daten darin, ich möchte nur die Links zu Pasten vorhanden (Beispiel: http://pastebin.com///Y5JhyKQT) und keine Links zu anderen Seiten wie pastebin.com/tools). Dies ist so, dass ich wget setzen kann, um jede einzelne Paste zu ziehen.Extrahieren von Zeilen mit einer bestimmten Anzahl von Zeichen

Die einzige Möglichkeit, dies zu tun, ist ein Bash-Skript zu schreiben, um die Anzahl der Zeichen in jeder Zeile zu zählen und nur Zeilen mit 30 Zeichen genau zu halten (das ist die Länge der URLs zu Pasten verbinden).

Ich habe keine Ahnung, wie ich etwas mit grep oder awk implementieren würde, vielleicht mit einer while do-Schleife? Jede Hilfe wäre willkommen!

http://pastebin.com///tools 
http://pastebin.com//top.location.href 
http://pastebin.com///trends 
http://pastebin.com///Y5JhyKQT <<< I want to keep this 
http://pastebin.com//= 
http://pastebin.com///> 
+0

Sie können es einfach in Python tun, so dass Sie nicht Lärm haben müssen, um es später mit wget zu überprüfen. Siehe meine Antwort für Python unten. Schreiben Sie nicht in die Datei, wenn es länger als die Länge ist. –

+1

Die Zeile, von der Sie sagen, dass sie enden soll, endet in 'Y5JhyKQT' und hat deshalb am Ende keine 8 zufälligen Ziffern, also nehme ich an, Sie meinen' 8 zufällige alphanumerische Zeichen'. Wie würdest du das dann von der Zeile unterscheiden, die du nicht davor haben willst, die in "Trends" endet, wenn es in einem 8-stelligen Wort wie "trendiger" statt "Trends" endet? Oder ist das nur ein völlig irrelevanter Ablenkungsmanöver, den du da reingeworfen hast und alles, was wirklich zählt, ist die Zeilenlänge von 30 Zeichen? –

Antwort

0
#!/usr/bin/env zsh 
while read aline 
do 
    if [[ ${#aline} == 30 ]]; then                                       
     #do something 
    fi 
done 

Dies wird in der bash man pages unter "Parameter Expansion" Abschnitt dokumentiert.

EDIT = Diese Lösung ist zsh-only

+2

Tu es nicht. Siehe [why-is-using-a-shell-loop-to-process-text-built-bad-practice] (http://unix.stackexchange.com/questions/169716/why-is-using-a-shell) -loop-to-process-text-betrachtet-schlechte-Praxis). –

+0

Whoops, ich denke, ich habe zsh viel zu lange verwendet –

+0

Es wäre immer noch der falsche Ansatz in zsh mit (fast?) Alle die gleichen Probleme. Eine Shell ist eine Umgebung, in der Tools mit einer Sprache aufgerufen werden können, um diese Aufrufe zu sequenzieren. Es ist kein Tool zum Bearbeiten von Text. –

0

Dieser Algorithmus

  • alle Zeichen zwischen den neuen Linienzeichen oder read one line at a time zu finden ist.
  • Zählen Sie sie oder store them in variable and get its count. Dies ist die Länge Ihrer Linie. Verarbeiten Sie nur die Zeilen, die genau die gleiche Anzahl haben, wie Sie möchten. In Python gibt es beide Funktionen Zeichenanzahl von String und Lesezeile.
1

Von der Probe Sie es geschrieben sieht aus wie alles, was Sie brauchen:

grep -E '/[[:alnum:]]{8}$' file 

oder vielleicht:

grep -E '^.{30}$' file 

Wenn das für Sie nicht funktioniert, erklären, warum und bieten bessere Probe.

+0

Warum nicht "awk" Länge() == 30''?Das würde ohne einen regulären Ausdruck funktionieren und es ist ziemlich sauber, nicht wahr? – hek2mgl

+0

idk, wenn ein Funktionsaufruf schneller wäre als dieser regexp-Vergleich plus awk muss tun Feld Splitting auf jeder Zeile, so bin ich etwa 99% sicher, dass die grep effizienter sowie kürzer sein würde. egal wie auch immer. Ich begann zu denken, dass der Schlüssel dazu darin bestand, dass die letzten 8 Zeichen alphanumerisch waren, so dass sie mich irgendwie auf den grep/regexp Weg führten. –

+1

Es fühlt sich an, als ob du recht hast. Die Aufteilung in Felder ist ein unnötiger Overhead. Danke für die Rückmeldung! – hek2mgl