bash & sed, alle Zeichen entfernen, außer ..

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: bash & sed, alle Zeichen entfernen, außer ..

Beitrag von Meillo » 30.04.2020 11:02:17

Exxter hat geschrieben: ↑ zum Beitrag ↑
30.04.2020 10:46:12
Und wäre "tr -dc [:alnum:]-_" nicht auch eine Lösung? Soweit ich das verstanden habe bedeutet das -c: "filtere alles weg, außer das angegebene (Buchstaben, Zahlen, - und _)"?
Deine Interpraetation des Befehls ist falsch. Das Minuszeichen steht nur am Anfang oder am Ende fuer sich selbst, sonst gibt es einen Bereich an.

Korrekt bedeutet dein Ausdruck: ... alles ausser alphanumerische Zeichen und allem zwischen dem zufaellig letzten Zeichen von [:alnum:] und dem Unterstrich. ;-)

So rum wird's funktionieren:

Code: Alles auswählen

tr -dc [:alnum:]_-
Use ed once in a while!

Exxter
Beiträge: 385
Registriert: 10.01.2003 00:15:15
Lizenz eigener Beiträge: GNU General Public License

Re: bash & sed, alle Zeichen entfernen, außer ..

Beitrag von Exxter » 30.04.2020 11:15:35

:facepalm: danke dir! Aber ist das eine gleichwertige Lösung zu eurer oder auch nur die halbe Wahrheit?

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: bash & sed, alle Zeichen entfernen, außer ..

Beitrag von Meillo » 30.04.2020 15:14:31

Exxter hat geschrieben: ↑ zum Beitrag ↑
30.04.2020 10:46:12
Ich habe eine Textdatei mit vielen Sonderzeichen erstellt und filter diese:

Code: Alles auswählen

root@cloud:/tmp/muelltest$ cat test.txt | printf %s "${1:-}" | LC_ALL=C tr -cs "a-zA-Z0-9_" "-" | sed -e 's/^-// ; s/-$//'
root@cloud:/tmp/muelltest$
Da kommt aber nichts durch?
Das liegt daran, dass das `printf' hier nicht hingehoert. ;-)

Das `cat' gibt den Inhalt von `test.txt' auf stdout aus, das wandert into `printf', das stdin aber gar nicht liest, sondern nur das erste Argument des Scripts ausgibt. Du musst das `cat' *statt* dem `printf' in die Pipeline setzen.

Ich möchte den Filter in folgendes Script in der kommentar-Zeile einbauen
Es wird uebersichtlicher wenn du dafuer eine Funktion verwendest. Etwa so:

Code: Alles auswählen

simplifystring() {
	tr ... | sed ... # hier die Befehlszeile die den Input umbaut, *ohne* printf/echo/cat davor
}

...
for f in $dateien
do
	kommentar="$(exiftool ... | simplifystring)"
	
...
(Eine Shellfunktion verhaelt sich wie ein Shellscript oder ein sonstiger Befehl.)

(hier noch mit der bisherigen Lösung die nicht ausreichend ist):

Code: Alles auswählen

dateien=$(find . -iname '*.jpg' -size +3k -type f | sed 's/.\///')
for f in $dateien
do
	kommentar=$(exiftool -v $f | grep Comment | sed -e "s/  | | 18) UserComment = GCM_TAG//" | tr -d [:blank:] | tr -d [:space:] | tr -d [:cntrl:] | tr -d [:graph:]  | sed -z 's/[^0-9a-zA-Z\_\-]*//g')
	seriennummer=$(echo "$kommentar" | grep -o '[0-9]*')
	abteilungundserial=$(echo "$kommentar" | sed -e "s/$seriennummer//")
	abteilung=$(echo "$abteilungundserial" | sed -e "s/SERIAL//I")
	datum=$(exiftool -v $f | grep DateTimeOriginal | sed -e "s/  | | 5)  DateTimeOriginal = //")
	datumformat=$(echo "$datum" | sed -e 's/:/-/g' -e 's/ /-/g')
	
	dateiname=$(echo "$serial"-"$seriennummer"-"$abteilung"-"$datumformat")
	
done
Wo kommt denn das `-z' bei sed her? Was macht das ueberhaupt? (NULL-terminierten Input verarbeiten?!) Ich sehe nicht wozu das noetig waere, moeglicherweise ist das ein Problem.

... wobei `tr -d [:graph:]' natuerlich auch alle grafischen, also druckbaren Zeichen entfernt. :-D


Soviel mal an schneller Analyse. Versuche das aufzugreifen, dann poste gerne wieder.
Use ed once in a while!

Antworten