Ich erhalte eine Textdatei apt-get --print-uris dist-upgrade > /mnt/URIs.txt
und möchte alle Pakete mit den in der Textdatei angegebenen URLs herunterladen. Nur der Text zwischen den „“ ist eine URL. Wie entferne ich den Rest, da zum Herunterladen durch den Internetbrowser nur URLs und Return-Symbole verwendet werden?
Antwort1
Die Ausgabe von apt-get --print-uris dist-upgrade
may sieht ungefähr so aus:
Reading package lists...
Building dependency tree...
Reading state information...
Calculating upgrade...
The following packages will be upgraded:
evolution-data-server evolution-data-server-common gir1.2-goa-1.0
gnome-online-accounts libcamel-1.2-62 libebackend-1.2-10 libebook-1.2-20
libebook-contacts-1.2-3 libecal-2.0-1 libedata-book-1.2-26
libedata-cal-2.0-1 libedataserver-1.2-24 libedataserverui-1.2-2
libgoa-1.0-0b libgoa-1.0-common libgoa-backend-1.0-1 libyelp0 linux-libc-dev
python-apt-common python3-apt yelp
21 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 4,358 kB of archives.
After this operation, 16.4 kB of additional disk space will be used.
'http://se.archive.ubuntu.com/ubuntu/pool/main/p/python-apt/python-apt-common_2.0.0ubuntu0.20.04.5_all.deb' python-apt-common_2.0.0ubuntu0.20.04.5_all.deb 17052 MD5Sum:a9e11f5f8671c5069f5edaef32e2f620
'http://se.archive.ubuntu.com/ubuntu/pool/main/p/python-apt/python3-apt_2.0.0ubuntu0.20.04.5_amd64.deb' python3-apt_2.0.0ubuntu0.20.04.5_amd64.deb 154164 MD5Sum:8590dd473b444f2756e5c7498e00e7ec
'http://se.archive.ubuntu.com/ubuntu/pool/main/g/gnome-online-accounts/libgoa-1.0-common_3.36.1-0ubuntu1_all.deb' libgoa-1.0-common_3.36.1-0ubuntu1_all.deb 3752 MD5Sum:9252da969452bdf88527829a752ac175
(diese Ausgabe ist gekürzt)
Angenommen, Sie möchten die „sauberen“ URIs aus dem obigen Code herausfiltern, sed
würde der folgende Befehl alle Zeilen von der ersten bis zur Zeile löschen, die mit der Zeichenfolge beginnt After
(einschließlich). In den verbleibenden Zeilen würde er alles nach dem Leerzeichen löschen und dann das erste und letzte Zeichen aus der geänderten Zeile löschen (dadurch würden die einfachen Anführungszeichen um die URIs gelöscht).
sed '1,/^After/d; s/ .*//; s/.//; s/.$//'
Ich verwende dies für die Ausgabe meines kurzen Beispiels oben:
$ sed '1,/^After/d; s/ .*//; s/.//; s/.$//' file
http://se.archive.ubuntu.com/ubuntu/pool/main/p/python-apt/python-apt-common_2.0.0ubuntu0.20.04.5_all.deb
http://se.archive.ubuntu.com/ubuntu/pool/main/p/python-apt/python3-apt_2.0.0ubuntu0.20.04.5_amd64.deb
http://se.archive.ubuntu.com/ubuntu/pool/main/g/gnome-online-accounts/libgoa-1.0-common_3.36.1-0ubuntu1_all.deb
Bei den gleichen Eingabedaten kann der Befehl
sed -n "s,.*\(http://[^']*\).*,\1,p" file
würde auch funktionieren. Dabei wird versucht, alle Teilzeichenfolgen abzugleichen, die mit http://
einem einfachen Anführungszeichen beginnen und vor einem solchen enden. Anschließend wird die gesamte Zeile durch diese Teilzeichenfolge ersetzt und die geänderte Zeile gedruckt. Nicht übereinstimmende Zeilen werden verworfen.