[gelöst] CUT-Befehl mit Beibehaltung des Trennzeichens
[gelöst] CUT-Befehl mit Beibehaltung des Trennzeichens
... ist jetzt nicht wirklich "Scripting" und ist auch eine blutige Anfängerfrage, aber ich weiss nicht, wohin damit sonst:
es geht um den cut-Befehl und zwar darum, wie man den Delimiter beibehalten kann; mein Trenner ist "«" und alles davor sollte gelöscht werden; cut -d« -f1 löscht aber auch das Trennzeichen
das dürfte wohl äusserst simpel sein, nur finde ich die Lösung nicht
es geht um den cut-Befehl und zwar darum, wie man den Delimiter beibehalten kann; mein Trenner ist "«" und alles davor sollte gelöscht werden; cut -d« -f1 löscht aber auch das Trennzeichen
das dürfte wohl äusserst simpel sein, nur finde ich die Lösung nicht
Zuletzt geändert von kalamazoo am 28.03.2023 22:37:33, insgesamt 1-mal geändert.
Re: CUT-Befehl mit Beibehaltung des Trennzeichens
cut selbst kann das m.W. nicht. Du kannst das Trennzeichen aber natürlich einfach selbst davor nochmal ausgeben.
Generell wären verschiedene Lösungen für deine Frage möglich. Kommt im Einzelnen ein bisschen auf deine Anwendung drum herum an.
Eine Idee etwa: Ersetze deinen cut-Aufruf
genau mit
Btw.: Wenn du alles vor dem Trennzeichen loswerden willst, müsste es doch
lauten.
Generell wären verschiedene Lösungen für deine Frage möglich. Kommt im Einzelnen ein bisschen auf deine Anwendung drum herum an.
Eine Idee etwa: Ersetze deinen cut-Aufruf
Code: Alles auswählen
cut -d« -f1
Code: Alles auswählen
{ printf «; cut -d« -f1; }
Btw.: Wenn du alles vor dem Trennzeichen loswerden willst, müsste es doch
Code: Alles auswählen
{ printf «; cut -d« -f2-; }
Manchmal bekannt als Just (another) Terminal Hacker.
Re: CUT-Befehl mit Beibehaltung des Trennzeichens
Zwei alternative Lösungen (ohne cut):
Code: Alles auswählen
grep -o '^[^«]*«'
sed 's/«.*/«/'
Re: CUT-Befehl mit Beibehaltung des Trennzeichens
Also geht das tatsächlich nicht mit cut! An das Wiedereinfügen habe ich auch gedacht, das schien mir aber wenig elegant.JTH hat geschrieben:28.03.2023 16:16:23cut selbst kann das m.W. nicht. Du kannst das Trennzeichen aber natürlich einfach selbst davor nochmal ausgeben.
Grundsätzlich geht es darum, dass ich in einem Verzeichnis mit einer Reihe von Unterverzeichnissen gewisse Folder auswähle und die Ausgabe bei einem bestimmten Marker innerhalb des Dateinamens beginnen lasse. Mein CUT-Befehl ist auch insofern schon etwas verkorkst, als ich nicht weiss, wie man alles VOR einem bestimmten Feld löscht (hier noch "/", da ja der Pfad vor dem Dateinamen auch weg soll), weshalb ich den jeweiligen String zweimal mit rev umkehre, was dann so aussieht:
Code: Alles auswählen
$ find -type d -iname "MUSTER" | rev | cut -d"/" -f1 | rev | sort -h > DATEI.TXT
Code: Alles auswählen
$ find -type d -iname "MUSTER" | awk -F"/" '{print $NF}' | sort -h > DATEI.TXT
Mit grep ginge das auch?tobo hat geschrieben:28.03.2023 16:44:21Zwei alternative Lösungen (ohne cut):Code: Alles auswählen
grep -o '^[^«]*«' sed 's/«.*/«/'
Ja, mit sed sieht das sehr elegant aus, die Syntax scheint ähnlich wie bei rename -- nur: was macht der Punkt?
Beide dürften aber nichts wegschneiden, oder?
Re: CUT-Befehl mit Beibehaltung des Trennzeichens
Was du also letztendlich hier möchtest (wenn ich dich richtig verstehe), ist, den Basename eines Pfades auszugeben – den Teil hinter dem letzten / in einem Pfad.
Das kann find praktischerweise schon von alleine mit der Aktion -printf:
%f ist der Platzhalter für den Basename.
Wenn es nicht unbedingt sortiert sein muss, schreibt find mit -fprintf auch direkt in eine Datei:
Siehe man find zu -printf.
Das kann find praktischerweise schon von alleine mit der Aktion -printf:
Code: Alles auswählen
find -type d -iname "MUSTER" -printf '%f\n' | sort -h > DATEI.TXT
Wenn es nicht unbedingt sortiert sein muss, schreibt find mit -fprintf auch direkt in eine Datei:
Code: Alles auswählen
find -type d -iname "MUSTER" -fprintf DATEI.TXT '%f\n'
Manchmal bekannt als Just (another) Terminal Hacker.
Re: CUT-Befehl mit Beibehaltung des Trennzeichens
Geht doch bestimmt viel einfacher mit awk, oder?
Re: CUT-Befehl mit Beibehaltung des Trennzeichens
Sed und grep muss angepasst werden, da ich das oben falsch gelesen habe - der Teil soll ja entfernt werden:
Der . steht für ein beliebiges Zeichen, der * ist der Quantor für den . und bedeutet beliebig viele (*) beliebige Zeichen (.). Ergo, den Rest der Zeile.
Wobei 1. die Frage ist, ob "«de«fg" überhaupt die angestrebte Lösung ist und nicht eher "«de" und 2. du wohl besser dein eigentliches Anliegen genau erklärst. Ansonsten wird das zum Klassiker für ein xy-Problem.
Code: Alles auswählen
$ echo "ab«de«fg" | sed 's/[^«]*//'
«de«fg
$ echo "ab«de«fg" | grep -o '«.*'
«de«fg
Wobei 1. die Frage ist, ob "«de«fg" überhaupt die angestrebte Lösung ist und nicht eher "«de" und 2. du wohl besser dein eigentliches Anliegen genau erklärst. Ansonsten wird das zum Klassiker für ein xy-Problem.
Re: CUT-Befehl mit Beibehaltung des Trennzeichens
Ein basename ist in coreutils. Das ist sehr praktisch.JTH hat geschrieben:28.03.2023 18:26:12Was du also letztendlich hier möchtest (wenn ich dich richtig verstehe), ist, den Basename eines Pfades auszugeben – den Teil hinter dem letzten / in einem Pfad.
Einer der Vorteile von awk ist, dass man in einem BEGIN Block Variable initialisieren kann und in einem END Block die im mittleren Block "gesammelten" Daten nochmal aufbereiten kann.kalamazoo hat geschrieben:28.03.2023 17:48:44Eine Lösung mit awk habe ich auch gebastelt, bei der Syntax von awk kenne ich mich aber noch weniger aus als bei cut, welches ja relativ simpel ist.
Re: CUT-Befehl mit Beibehaltung des Trennzeichens
Brutalstes Quoting - es ist nur für sed aber nicht den Thread relevant.kalamazoo hat geschrieben:28.03.2023 17:48:44sed 's/«.*/«/'
Mit grep ginge das auch?
Ja, mit sed sieht das sehr elegant aus, die Syntax scheint ähnlich wie bei rename -- nur: was macht der Punkt?
Das .* bedeutet, dass keine oder beliebig viele Zeichen dem « folgen. Es wird also zum Beispiel ein «TriTra567 durch ein « ersetzt. Ohne den .* würde « nur durch « ersetzt.
Re: CUT-Befehl mit Beibehaltung des Trennzeichens
Den Basename auszugeben habe ich mit meinen beiden oben geposteten Commands schon geschafft. Die mittels find gefundenen Verzeichnisnamen haben aber manchmal noch irgendwelche Zeichen zwecks Gliederung im Verzeichnisnamen, e.g. -, _, + #, =, ~ oder auch Ziffern, Buchstaben, etc.. Das heisst, der Basename muss deswegen manchmal noch angepasst werden, wobei der relevante Teil mit « beginnt. "«" deshalb, weil dieses Zeichen sonst normalerweise nicht in Dateinamen vorkommt.JTH hat geschrieben:28.03.2023 18:26:12Was du also letztendlich hier möchtest (wenn ich dich richtig verstehe), ist, den Basename eines Pfades auszugeben – den Teil hinter dem letzten / in einem Pfad.
Die Option -printf ist ein sehr guter Vorschlag, nur dürfte der Name erst ab (und inklusive "«") ausgegeben werden und nicht ab "newline".
Ja, aber wie? Die Basename-Ausgabe mittels awk habe ich -- wie oben gepostet -- hinbekommen, aber nicht, wie ich den Teil vor dem französischen Anführungszeichen entfernen kann.
Danke für die Erklärung, schau ich mir gleich näher an!tobo hat geschrieben:28.03.2023 18:37:00Der . steht für ein beliebiges Zeichen, der * ist der Quantor für den . und bedeutet beliebig viele (*) beliebige Zeichen (.). Ergo, den Rest der Zeile.
Das soll es freilich nicht werden! Meine ursprüngliche Lösung war ja bis auf die ungewollte Beseitigung auch des Trennzeichens dem Ziel schon ziemlich nahe, weshalb ich die Frage möglichst kurz halten und in kein unnötiges Gelaber verfallen wollte. Meine obenstehende, etwas knapp gehaltene Erklärung war diese:tobo hat geschrieben:28.03.2023 18:37:00Wobei 1. die Frage ist, ob "«de«fg" überhaupt die angestrebte Lösung ist und nicht eher "«de" und 2. du wohl besser dein eigentliches Anliegen genau erklärst. Ansonsten wird das zum Klassiker für ein xy-Problem.
Also: ich will mir in einer Verzeichnisstruktur mit tausenden Unterverzeichnissen und zehntausenden Dateien einen gewissen Überblick verschaffen; das ganze ist über die Jahre einigermaßen ins Unübersichtliche gewachsen, weshalb ich bestimmte syntaktische Regeln einzuführen begonnen habe (das "«" ist nur eine davon), um überhaupt etwas zu finden, wenn ich was suche (die Ziffern, Buchstaben, -, _, + #, =, ~ etc. am Verzeichnis- oder auch Dateibeginn sind andere Gliederungsebenen). Jetzt will ich solche Verzeichnisbäume in eine Datei ausgeben, ordnen und dann abgleichen. Ich hoffe, das ist jetzt etwas klarer.kalamazoo hat geschrieben:28.03.2023 17:48:44Grundsätzlich geht es darum, dass ich in einem Verzeichnis mit einer Reihe von Unterverzeichnissen gewisse Folder auswähle und die Ausgabe bei einem bestimmten Marker innerhalb des Dateinamens beginnen lasse. Mein CUT-Befehl ist auch insofern schon etwas verkorkst, als ich nicht weiss, wie man alles VOR einem bestimmten Feld löscht (hier noch "/", da ja der Pfad vor dem Dateinamen auch weg soll), weshalb ich den jeweiligen String zweimal mit rev umkehre, was dann so aussieht:
Das ganze klingt wahrscheinlich jetzt schon ziemlich "nerdy". Wenn ich das noch näher ausführe, glaubt ihr wahrscheinlich, dass ich ein Fall für die Klapsmühle bin ... was durchaus etwas für sich haben dürfte, versuche ich doch etwa 25.000.000 Dateien und 3,5 Millionen Verzeichnisse auf ca.50TB zu organisieren (okay, die folgen nicht alle einem bestimmten Schema), also mehr oder weniger alles, was sich in den letzten Jahrzehnten, seitdem ich den Windeln entwachsen bin und auf Computern arbeite, angesammelt hat.
Und bei «* (also ohne Punkt) hätte das * gar keine Auswirkung, wäre also wie ein einfaches « ?chrbr hat geschrieben:28.03.2023 18:58:13Das .* bedeutet, dass keine oder beliebig viele Zeichen dem « folgen. Es wird also zum Beispiel ein «TriTra567 durch ein « ersetzt. Ohne den .* würde « nur durch « ersetzt.
Ich muss mir diese RegEx wirklich einmal genauer anseheh!
Re: CUT-Befehl mit Beibehaltung des Trennzeichens
Das stimmt fast. Der Stern bedeutet keines, eines oder beliebig viele des Zeichens vorher. «* kann also passen zu nichts, zu « oder auch zu «««««. Dagegen steht ein + für eines oder beliebig viele des Zeichens vorher. Nimm dir Zeit für die RegEx.Es lohnt sich.kalamazoo hat geschrieben:28.03.2023 20:07:29chrbr hat geschrieben: ↑ zum Beitrag ↑
28.03.2023 18:58:13
Das .* bedeutet, dass keine oder beliebig viele Zeichen dem « folgen. Es wird also zum Beispiel ein «TriTra567 durch ein « ersetzt. Ohne den .* würde « nur durch « ersetzt.
Und bei «* (also ohne Punkt) hätte das * gar keine Auswirkung, wäre also wie ein einfaches « ?
Ich muss mir diese RegEx wirklich einmal genauer anseheh!
Re: CUT-Befehl mit Beibehaltung des Trennzeichens
Okay, got it! Das Asterisk * als Wildcard ist ja Usus und der Dot "." davor offenbar eine RexEx Besonderheit -- Punkt-Sternchen mit dem führenden Anführungszeichen ist logisch stringent.chrbr hat geschrieben:28.03.2023 22:03:33Der Stern bedeutet keines, eines oder beliebig viele des Zeichens vorher. «* kann also passen zu nichts, zu « oder auch zu «««««. Dagegen steht ein + für eines oder beliebig viele des Zeichens vorher. Nimm dir Zeit für die RegEx.Es lohnt sich.
Angepasst sieht das dann so aus:
Code: Alles auswählen
$ find -type d -iname "PATTERN" | sed 's/[^«]*//' | sort -h > /HOME/FILE.TXT
bzw.
$ find -type d -iname "PATTERN" | grep -o '«.*' | sort -h > /HOME/FILE.TXT
Danke für eure Hilfe!
Re: [gelöst] CUT-Befehl mit Beibehaltung des Trennzeichens
Vielleicht noch eine kurze Zusammenfassung:
liefern das gleiche Ergebnis, nämlich den Basename; wobei der CUT-Befehl der deutlich langsamste ist
liefern mit "cut: the delimiter must be a single character" die gleiche Fehlermeldung (wobei ich nicht wirklich weiss, was hier an der Syntax falsch sein soll)
liefern doch nicht ein ganz gleiches Ergebnis: aus irgendeinem Grund gibt der Befehl mit SED manchmal auch einige Leerzeilen aus
Code: Alles auswählen
$ find -type d -iname PATTERN | rev | cut -d"/" -f1 | rev | sort -h > FILE.TXT
$ find -type d -iname PATTERN | awk -F"/" '{print $NF}' | sort -h > FILE.TXT
$ find -type d -iname PATTERN -printf '%f\n' | sort -h > FILE.TXT
Code: Alles auswählen
$ find -type d -iname PATTERN | rev | { printf «; cut -d« -f1; } | rev | sort -h > FILE.TXT
$ find -type d -iname PATTERN | rev | { printf «; cut -d« -f2-; } | rev | sort -h > FILE.TXT
Code: Alles auswählen
$ find -type d -iname "PATTERN" | sed 's/[^«]*//' | sort -h > FILE.TXT
$ find -type d -iname "PATTERN" | grep -o '«.*' | sort -h > FILE.TXT
Re: [gelöst] CUT-Befehl mit Beibehaltung des Trennzeichens
Ja, der sed-Befehl war insgesamt ziemlich unsauber/falsch. Er matcht z.B. auf die Leerzeile oder auch auf eine beliebige Zeile ohne «. Identisch zum grep ist sowas hier:
Listet nur noch, was bearbeitet wird und bearbeitet nur noch, was « beinhaltet.
Code: Alles auswählen
sed -n '/«/s/[^«]*//p'
Re: [gelöst] CUT-Befehl mit Beibehaltung des Trennzeichens
Zu den regulären Ausdrücken gibt eine passende Geschichte. Natürlich ist alles wahr und kein Wort gelogen.
Code: Alles auswählen
Vor nicht allzu langer Zeit hatte ein Informatiker ein Problem.
Er dachte nach, überlegte. Doch es war keine Lösung in Sicht.
Doch eines Morgens rief er "Heureka, ich verwende reguläre Ausdrücke."
Von dem Moment an hatte der Informatiker zwei Probleme.
Re: [gelöst] CUT-Befehl mit Beibehaltung des Trennzeichens
... und dann kam die Einsicht, dass sich nicht alle Probleme mit Chomsky Typ-3-Grammatik lösen lassen ...
Chomsky-Hierarchie (Wikipedia)
Chomsky-Hierarchie (Wikipedia)
Re: [gelöst] CUT-Befehl mit Beibehaltung des Trennzeichens
Hallo @uname,
das ist ein interessanter Artikel. Von einigen wenigen Dingen hatte ich eine nebulöse Vorstellung, von dem meisten Dingen praktisch keine Ahnung. Den Artikel werde ich noch mehrfach lesen müssen und die Links sind bestimmt auch hilfreiche.
Ganz klar ist mir, dass das reine Programmieren nur ein winziger Punkt darstellt. Genauso wie bei einem Elektronik Hardwareentwickler voraus setzbar sein sollte, dass er auch löten kann.
Vielen Dank,
Christoph
das ist ein interessanter Artikel. Von einigen wenigen Dingen hatte ich eine nebulöse Vorstellung, von dem meisten Dingen praktisch keine Ahnung. Den Artikel werde ich noch mehrfach lesen müssen und die Links sind bestimmt auch hilfreiche.
Ganz klar ist mir, dass das reine Programmieren nur ein winziger Punkt darstellt. Genauso wie bei einem Elektronik Hardwareentwickler voraus setzbar sein sollte, dass er auch löten kann.
Vielen Dank,
Christoph
Re: [gelöst] CUT-Befehl mit Beibehaltung des Trennzeichens
Ja, jetzt scheint er fehlerfrei! Danke!tobo hat geschrieben:29.03.2023 00:29:26Ja, der sed-Befehl war insgesamt ziemlich unsauber/falsch. Er matcht z.B. auf die Leerzeile oder auch auf eine beliebige Zeile ohne «. Identisch zum grep ist sowas hier:Listet nur noch, was bearbeitet wird und bearbeitet nur noch, was « beinhaltet.Code: Alles auswählen
sed -n '/«/s/[^«]*//p'
Mit der Syntax muss ich mich noch etwas beschäftigem
Hey, was erwartet ihr von einem Susi-Sorglos WindowsXP-Anwender wir mir? Dass er sich vielleicht auch noch mit Computern und deren Programmierung beschäftigt? Klick and go! ... oder ist das bei Windows nicht Doppelklick?uname hat geschrieben:29.03.2023 09:51:24... und dann kam die Einsicht, dass sich nicht alle Probleme mit Chomsky Typ-3-Grammatik lösen lassen ...
Chomsky-Hierarchie (Wikipedia)
Dank an alle, die mir dabei helfen, den Horizont meiner Ignoranz etwas zurückzudrängen
Re: [gelöst] CUT-Befehl mit Beibehaltung des Trennzeichens
Ah, anscheinend (?!) ist (GNU) cut nicht in der Lage, mit Multibyte-Charactern umzugehen.kalamazoo hat geschrieben:28.03.2023 23:36:44liefern mit "cut: the delimiter must be a single character" die gleiche Fehlermeldung (wobei ich nicht wirklich weiss, was hier an der Syntax falsch sein soll)Code: Alles auswählen
$ find -type d -iname PATTERN | rev | { printf «; cut -d« -f1; } | rev | sort -h > FILE.TXT $ find -type d -iname PATTERN | rev | { printf «; cut -d« -f2-; } | rev | sort -h > FILE.TXT
« besteht aus zwei Byte, im Gegensatz zu z.B. /:
Code: Alles auswählen
~$ for c in « /; do printf "$c" | xxd; done
00000000: c2ab ..
00000000: 2f /
Manchmal bekannt als Just (another) Terminal Hacker.
Re: [gelöst] CUT-Befehl mit Beibehaltung des Trennzeichens
Auf der flachen Erde könntest du den Horizont bis ans Ende der Erdscheibe zurückdrängen (da wo du runterfällst). Auf der Kugelerde kannst du aufgrund der Horizontformel den Horizont etwa mit der Wurzel deiner aktuellen Höhe zurückdrängen. Am besten du ziehst ins Gebirge. Ach ne ging ja nur um Ignoranz. Hatte ich doch glatt bei meinem Kommentar ignoriert.kalamazoo hat geschrieben: Dank an alle, die mir dabei helfen, den Horizont meiner Ignoranz etwas zurückzudrängen
Horizont/Sichtweite berechnen, Youtube Flo+, Geodäsie
Re: [gelöst] CUT-Befehl mit Beibehaltung des Trennzeichens
So weit klar -- aber könnt ihr mir einen Link oder gerne auch ein Buch (gerne auch in Englisch) zum Skripting empfehlen, da habe ich nämlich noch viel Aufholbedarf!JTH hat geschrieben:29.03.2023 12:56:41Ah, anscheinend (?!) ist (GNU) cut nicht in der Lage, mit Multibyte-Charactern umzugehen.
Im Gebirge verstellen mir die Berge den Horizont oder das schlechte Wetter. Es würde reichen, wenn ihr mir beim Wachsen helft, dem geistigen und wissensmäßigen meine ich!uname hat geschrieben:29.03.2023 13:17:49Auf der flachen Erde könntest du den Horizont bis ans Ende der Erdscheibe zurückdrängen (da wo du runterfällst). Auf der Kugelerde kannst du den Horizont etwa mit der Wurzel deiner aktuellen Höhe zurückdrängen (Horizontformel). Am besten du ziehst ins Gebirge. Ach ne ging ja nur um Ignoranz
Re: [gelöst] CUT-Befehl mit Beibehaltung des Trennzeichens
Du kannst ja mal das PDF Useless use of * anschauen.kalamazoo hat geschrieben:So weit klar -- aber könnt ihr mir einen Link oder gerne auch ein Buch (gerne auch in Englisch) zum Skripting empfehlen, da habe ich nämlich noch viel Aufholbedarf!
Leider geht es dort mehr um cat als um cut. Aber so groß ist der Unterschied gar nicht. Zudem hast du vielleicht auch dort noch Aufholbedarf.
Wirklich interessant wird es ab Seite 18.
Re: [gelöst] CUT-Befehl mit Beibehaltung des Trennzeichens
Im Wiki zu suchen ist nie verkehrt. https://wiki.debianforum.de/Regul%C3%A4 ... r%C3%BCckekalamazoo hat geschrieben:29.03.2023 13:37:10So weit klar -- aber könnt ihr mir einen Link oder gerne auch ein Buch (gerne auch in Englisch) zum Skripting empfehlen, da habe ich nämlich noch viel Aufholbedarf!
Ziemlich unten steht etwas von einen gewissen meillo .
Re: [gelöst] CUT-Befehl mit Beibehaltung des Trennzeichens
Ernsthaft? ... ich habe eine Katzenallergie
Danke, werde ich mir über die Feiertage näher ansehen. Es gibt eine Menge Websites diesbezüglich, ich dachte nur, es gibt irgendeine Art Standardwerk darüber.chrbr hat geschrieben:29.03.2023 14:02:39Im Wiki zu suchen ist nie verkehrt. https://wiki.debianforum.de/Regul%C3%A4 ... r%C3%BCcke
Re: [gelöst] CUT-Befehl mit Beibehaltung des Trennzeichens
Da Shell heute gleichzusetzen mit Bash ist, könnten die beiden hier was sein:kalamazoo hat geschrieben:29.03.2023 13:37:10So weit klar -- aber könnt ihr mir einen Link oder gerne auch ein Buch (gerne auch in Englisch) zum Skripting empfehlen, da habe ich nämlich noch viel Aufholbedarf!
https://tldp.org/LDP/Bash-Beginners-Gui ... index.html
https://tldp.org/LDP/abs/html/
Wobei die aber eher nebeneinander und ergänzend stehen und nicht nacheinander, wie die Titel vielleicht vermuten lassen könnten. Sind auch als PDFs erhältlich (in der URL zurückgehen).