• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] Text filtern

Hallo !
Bin neu hier & möchte zunächst nur kurz die übersichtliche Gestaltung hier loben (wenn ich darf). Bin übrigens Anfänger...
Meine Frage: Gibt es eine Möglichkeit, aus einem Text einen Teil herauszufiltern, und zwar nicht nach Zeile, sondern derart, dass alles, was zwischen zwei Markierungen steht ( etwa *.........* ) mittels cat in eine Datei geschrieben wird ? Hintergrund ist, dass ich gerne die Stickynotes benutze, um Text aus Webseiten zu kopieren und als allgemeiner Ideenpool. Da die Dinger aber auch lästig werden können, habe ich mir einen Starter angelegt, der den Inhalt der Zettel (/home/tux/.gnome2/sickynotes_applet) mit cat >> in eine Datei schreibt, und einen zweiten, der sie mit lynx wieder zugänglich macht. Cool wäre nun aber, Abschnitte in den Notes markieren zu können, so dass nur dieser Teil kopiert wird... sed oder awk sind mir zur Zeit noch zu schwer (oder es fehlt eine eher leichte Anleitung). Geht das nicht auch mit Unix-Befehlen oder einem einfachen Shellscript ? ...jede einzelne Zeile zu markieren ist zu langwierig...
Grüße, Tom :D
 
Hi,

mit sed geht das so:

Code:
... |sed -n '/\*/,/\*/p'|sed '1s/^.*\*//'| sed '$s/\*.*$//'

Alternative wäre ein Mini-C-Programm. Das Default-Trennzeichen ist *. Oder das erste Zeichen des ersten Parameters. Im Gegensatz zu oben werden die Trennzeichen mit ausgegeben und ein Newline wird angehängt:

Code:
/* selectcat.c */
#include <stdio.h>

main(int argc, char* argv[])
{
  int i, out=0;
  char trenner='*';
  if (argc>1) trenner=*argv[1];
  while((i=getchar())!=EOF) {
     if (i==trenner){
       if(out==1){
         out=0;
         putchar(i);
       }
       else out=1;
     }
     if(out==1)putchar(i);
  }
  printf("\n");
}

Gruß
schusch
 
Hallo Schusch !
Vielen Dank für die Antwort ! Habe den SED-Code eingebaut & das ganze klappt auch gut. aber oft auch nicht. Die Fehlermeldung ist:
Code:
/home/tux/bin/cp_notes1: line 3: 1s/^.*\*//: Datei oder Verzeichnis nicht gefunden
Habe in meiner Unwissenheit noch #!/bin/sh zugefügt und versucht , den sed-Code zu maskieren...aber Pustekuchen.
Warum das am Anfang mit demselben Code tadellos geklappt hat und nun nicht mehr... :?: Gruß, Tom
 
Hi,

Achtung! Du musst mit single quote ' für die shell maskieren.
Die * sind mit \ für sed maskiert, da für sed ein * beliebig häufige Wiederholung heißt.
Falls es das nicht ist, füge mal nach
#!/bin/sh ein set -x ein und poste das Skript und die Ausgabe hier.

Gruß
schusch
 
Hallo again!

Sorry, daß es so lange gedauert hat...

Also, die Datei sieht zZT so aus:
Code:
#!/bin/sh set -x
cat  /home/tom/.gnome2/stickynotes_applet | sed -n '/\*/,/\*/p' | sed
'1s/^.*\*//' | sed '$s/\*.*$//' >> /home/tom/Desktop/DAT/D/DOKU/Notes1.htm
Die Ausgabe darauf:
Code:
tom@TOURNEE:~> cp_notes1
/bin/sh: set -x: Datei oder Verzeichnis nicht gefunden
Die Ausgabe ohne set -x:
Code:
tom@TOURNEE:~> cp_notes1
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
usw
/home/tom/bin/cp_notes1: line 3: 1s/^.*\*//: Datei oder Verzeichnis nicht gefunden
Wie gesagt, bin in dieser Sache noch ein wenig 'ungeübt', insofern ist mir Deine Anregung mit dem Maskieren nicht klar...ich denke, das ist maskiert... :?: :?: :?:
Gruß, Tom
 
Code:
perl -ne 'print "$&\n" while/\*.*?\*/gs'
also einfacher kann's doch nicht gehen...! (Nur die Markierung ist ein bisschen... uneindeutig.)
 
Thanx !
Einfacher mag es wohl tatsächlich nicht gehen...
Hab mir das Zwecks späterer Versuche auch gespeichert. Tatsache ist aber auch, das ich mit meinem hypermodernem Linux-System :twisted: manchmal überfordert bin & darum gerne bei dem sed-script bleiben würde (weil ich da erstmal eine Chance habe, das bei Gelegenheit näher nachzuvollziehen)
...aber vielen Dank für die Hilfe (kommt alles... :idea: ) Tom
 
Also ich muss mich quasi entschuldigen...
obwohl ich 'drauf geachtet habe (der Grund ist wirklich zu dämlich...), hat mein lieber Freund kwrite einen Zeilenumbruch in das sedScript gebastelt...habe das erst mit dem Editor vom mc gemerkt :roll:
Doof geboren ist keiner, es geht mir meistens so (speziell bei Arbeiten am Rechner) . thanx thanx thanx..... :!:
Gruß, Tom
 
PS.:
Das Zeichen * ist übrigens tatsächlich recht lästig als Markierung - es kommt ständig bei Dateiangaben vor.
Habe * durch ^ ersetzt..auch nicht so gut, aber da stickynotes xml benutzt und Entitys produzieren, das Script aber nur mit einem Zeichen arbeitet...Ich benutze das ganze zB für diese Foren (auch PHP usw), um Fragen und Antworten zu verwalten. Einfach Zettel öffnen, Text reinkopieren, und mit einem Anwendungsstarter und cat >> immer in dieselbe Datei hinten anhängen, auf die dann wiederum ein Bookmark verweist.
Code:
cat  /home/tom/.gnome2/stickynotes_applet | sed -n '/\^/,/\^/p' | sed '1s/^.*\^//' | sed '$s/\^.*$//' | sed 's/note/br/g' | sed 's/->/<br>-/g' >> /home/tom/Desktop/DAT/D/DOKU/Notes1.htm
macht, das alles wohlfeil hintereinander wieder erscheint.Die Zeichen -> bewirken einen neuen Absatz...
Zettel löschen & gut. Klappt, vielen Dank !!
Gruß, Tom :D
 
Oben