suche mit grep oder find und Regular Expression

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
derilzemer
Beiträge: 25
Registriert: 05.11.2004 22:55:09

suche mit grep oder find und Regular Expression

Beitrag von derilzemer » 19.11.2024 16:27:15

Hallo zusammen,
ich habe wenig bis keine Ahnung Ahnung vom Scrpten, arbeite aber dennoch viel mit grep, find und sed und Shell-Scripten die ich mir zusammengebastelt habe. Aber in der Konstellation wie ich jetzt eine suche benötige habe ich null Erfahrung und benötige Unterstützung oder Hinweise um es anwenden zu können. Folgende Anforderung:

Ich betreibe seit 04.2018 ein Quartettportal, was ich gerade auf 2 sprachig umstelle. Die Webseiten basieren auf einem Template, was für Massenänderungen schon ausgelegt ist. Für das ersetzen der zu übersetzenden Passagen konnte ich bisher im Zusammenspiel mit find und sed bewerkstelligen. Einfaches Beispiel:

Code: Alles auswählen

find /volume1/web/quartette/qs-en/html-umbau_producer/producer/ -type f |xargs sed -i 's/>Rückseiten Variante.<\/a>/>Back pages variant.<\/a>/g'
Jetzt aber habe ich da aber einen "Block", den ich mir bis zum Schluss offen gelassen habe was das übersetzen angeht. Hier der Block Beispiel 1 (Zeile 1-18):

Code: Alles auswählen

<h3>6316886 - 1976</h3>
<h2>Flugzeuge</h2>
<h3>Ein Quartettspiel vom Jumbo-Jet zur Sportmaschine</h3><br>
<!-- <h3>Playing cards 1a-3d</h3>
	<p><div class="copyright">Card images: &copy; 2017 Verlag Altenburger Spielkarten</div></p>
	<p><div class="copyright">Card images: &copy; 2017 Wiener Spielkartenfabrik Ferd. Piatnik &amp; Söhne</div></p>
	<p><div class="copyright">&copy; NORIS-SPIELE Georg Reulein GmbH &amp; Co. KG</div></p> -->
	<div class="info-item-cap"><u>Additional info:</u></div>
	<div class="info-item"><span class="yellow">The game has been checked &amp; verified.</span><br></div>
<!-- <h3>6316886 - 1976 (Variante A - Box cover sheet)</h3>
<h2>Flugzeuge</h2><br>
<h3>Ein Quartettspiel vom Jumbo -Jet zur Sportmaschine</h3><br>
<h3>Playing cards 1a-3d</h3>
	<p><div class="copyright">Card images: &copy; 2017 Verlag Altenburger Spielkarten</div></p>
	<p><div class="copyright">Card images: &copy; 2017 Wiener Spielkartenfabrik Ferd. Piatnik &amp; Söhne</div></p>
	<p><div class="copyright">&copy; NORIS-SPIELE Georg Reulein GmbH &amp; Co. KG</div></p>
	<div class="info-item-cap"><u>Additional info:</u></div>
	<div class="info-item"><span class="yellow">The game has been checked &amp; verified.</span><br></div> -->
Der Block könnte aber auch so aussehen Block Beispiel 2 (Zeile 1-18)::

Code: Alles auswählen

<!-- <h3>6316886 - 1976</h3>
<h2>Flugzeuge</h2>
<h3>Ein Quartettspiel vom Jumbo-Jet zur Sportmaschine</h3><br>
<h3>Playing cards 1a-3d</h3>
	<p><div class="copyright">Card images: &copy; 2017 Verlag Altenburger Spielkarten</div></p>
	<p><div class="copyright">Card images: &copy; 2017 Wiener Spielkartenfabrik Ferd. Piatnik &amp; Söhne</div></p>
	<p><div class="copyright">&copy; NORIS-SPIELE Georg Reulein GmbH &amp; Co. KG</div></p>
	<div class="info-item-cap"><u>Additional info:</u></div>
	<div class="info-item"><span class="yellow">The game has been checked &amp; verified.</span><br></div> -->
<h3>6316886 - 1976 (Variante A - Box cover sheet)</h3>
<h2>Flugzeuge</h2><br>
<h3>Ein Quartettspiel vom Jumbo -Jet zur Sportmaschine</h3><br>
<h3>Playing cards 1a-3d</h3>
	<!-- <p><div class="copyright">Card images: &copy; 2017 Verlag Altenburger Spielkarten</div></p>
	<p><div class="copyright">Card images: &copy; 2017 Wiener Spielkartenfabrik Ferd. Piatnik &amp; Söhne</div></p>
	<p><div class="copyright">&copy; NORIS-SPIELE Georg Reulein GmbH &amp; Co. KG</div></p> -->
	<div class="info-item-cap"><u>Additional info:</u></div>
	<div class="info-item"><span class="yellow">The game has been checked &amp; verified.</span><br></div>
Mir geht es speziell um Zeile 10! Ich will über eine Suche herausfinden, wo Zeile 10 NICHT aus kommentiert ist, das

Code: Alles auswählen

<!-- 
Zeichen für Auskommentieren fehlt! Was in Zeile 10 noch als Unique zu bezeichnet werden kann ist das Wort "Variante". Wie bewerkstellige ich das, dass nur diese aktiven Zeilen explizit gefunden werden und direkt mit > in eine Textdatei übergeben werden?
Hier noch ein wahrscheinlich dilettantischer Versuch der Suche, aber die hat mir nur eine Zahl übermittelt die NICHT stimmen kann, da hat er nämlich ALLE templates gefunden, ergo hat die Integration in der Suche nicht so wirklich gepasst. Den RegEx habe ich auf https://regex101.com/ auf Funktionalität erfolgreich getestet.

Code: Alles auswählen

grep -rni '^(?!<!--  h3).*Variante' /volume1/web/quartette/qs/producer/ | sort -n -k1 > variantenblock-aktiv.txt
Er legt eine Datei an, aber mit 0 Inhalt.

Code: Alles auswählen

find . -type f \( ! -name '*-[0-9].html' -and \( -name 'g_*.html' -o -name 'gq_*.html' \) \) -printf . | wc -c
Das ist eine genutzten Suche, welche mir von einem Verlag die Anzahl genutzter Templates anzeigt: 704 Stück. Das stimmt so. Nun weiß ich, dass ich das Suchmuster in den 704 Templates 73 mal vorkommt. Ergo wollte ich diese Suche ergänzen und zwar so:

Code: Alles auswählen

find . -type f \( ! -name '*-[0-9].html' -and \( -name 'g_*.html' -o -name 'gq_*.html' -and \( -name '^\(?!<!-- <h3>\).*Variante' \) \) \) -printf . | wc -c
Ergebnis 703 :cry: Okay, ist auch eine 7 und eine 3 drin, aber eine 0 dabei.
Wer kann mir sagen, mit welchem Tool ich das am besten bewerkstelligen kann, grep oder find? Für eure Expertise oder Hilfestellung wäre ich euch sehr dankbar und verbunden.

Danke und Gruß
Andreas
Zuletzt geändert von derilzemer am 20.11.2024 18:12:47, insgesamt 1-mal geändert.

tobo
Beiträge: 2298
Registriert: 10.12.2008 10:51:41

Re: suche mit grep oder find und Regular Expression

Beitrag von tobo » 19.11.2024 16:59:39

Die beiden 10. Zeilen sind:

Code: Alles auswählen

[b]<!-- <h3>6316886 - 1976 (Variant A - Box cover sheet)</h3>[/b]
[b]<h3>6316886 - 1976 (Variante A - Box cover sheet)</h3>[/b]
Das [b​]...[/b] gehört da rein? Ist "Variant" oder "Variante" stabil? Das sind nur Textausschnitte, weswegen Zeile 10 - bezogen auf den gesamten Text - nicht Zeile 10 bleibt? Es soll die komplette Zeile ausgegeben werden, wenn kein <!-- am Anfang steht und der stabile Teil folgt?

Code: Alles auswählen

sed -n '/Variante/{/^<!--/!p}'

Benutzeravatar
derilzemer
Beiträge: 25
Registriert: 05.11.2004 22:55:09

Re: suche mit grep oder find und Regular Expression

Beitrag von derilzemer » 20.11.2024 18:43:16

Hallo Tobo,

danke erst einmal für deine Antwort.
die zum fett markieren habe ich vergessen zu entfernen als es mir auffiel dass es nicht geht im Code. Variante im einen Block habe ich auch vergessen anzupassen. Das habe ich jetzt mal nachgeholt, damit dazu keine Fragen mehr aufkommen.
Das mit dem Wort Variante ist generell sinnvoll als Variant zu nehmen, da ich das eine oder andere schon umbenannt habe von Variante in Variant. Somit würde ich Variant als stabil bezeichnen, da ich damit beide vorkommen erschlagen würde.
Und ja, wenn kein <!-- am Anfang steht, sollte dann die komplette Zeile in die Textdatei übergeben werden.

Den Code den du unten aufgeführt hast kann ich ja so noch nicht verwenden, richtig?

Code: Alles auswählen

 find /volume1/web/quartette/qs-en/html-umbau_producer/producer/ -type f |xargs sed -n '/Variante/{/^<!--/!p}'
Grüße Andreas

tobo
Beiträge: 2298
Registriert: 10.12.2008 10:51:41

Re: suche mit grep oder find und Regular Expression

Beitrag von tobo » 20.11.2024 19:21:14

Doch, das kannste so schon verwenden (ohne das e von Variante halt). Und das xargs am einfachsten direkt ins find eingelagert:

Code: Alles auswählen

find /volume1/web/quartette/qs-en/html-umbau_producer/producer/ -type f -exec sed -n '/Variant/{/^<!--/!p}' {} +

Benutzeravatar
derilzemer
Beiträge: 25
Registriert: 05.11.2004 22:55:09

Re: suche mit grep oder find und Regular Expression

Beitrag von derilzemer » 20.11.2024 20:02:56

Hi,

danke, das hat geklappt und funktioniert genau wie ich es benötige :hail:
Jetzt habe ich ja noch einen 2. Anwendungsfall und habe gedacht ich kann das ohne um die Aufschlüsselung der verwendeten Zeichen zu fragen für meinen 2. Case anwenden. Okay, hat natürlich nicht geklappt. Ahnlich wie im Fall zuvor habe ich in meinen Templates die Zeile (44)

Code: Alles auswählen

<div class="info-item"><span class="yellow">The game has been checked &amp; verified.</span><br></div>
Die ist immer in Zeile 44, nur ab und an steht zwischen </span><br> x-beliebiger Text drin. Das reicht vom Link (<a href="") über Sonderzeichen bis hin zu Buchstaben groß und klein und Zahlen. Im RegExtester konnte ich mit 'verified.</span><br>.+</div>' zumindest das mal finden. Das verified habe ich deswegen dazu nehmen müssen, weil es auch unique ist, da </span><br></div> in html Seiten sehr oft vorkommt.
Jetzt habe ich gedacht den String so zu "bauen"

Code: Alles auswählen

 find /volume1/web/quartette/qs-en/html-umbau_producer/producer/ -type f -exec sed -n '/verified/{<\/span><br>.+<\/div>}' {} + > verified.txt 
Ich dachte dass die {} und + am Ende wegen der Übergabe der kompletten Zeile steht, aber isses wohl nicht :cry:
Als Fehler meckert er --> sed: -e expression #1, char 12: unknown command: `<' an, was < nach der 1 { ist. Passe ich das ganze an

Code: Alles auswählen

find /volume1/web/quartette/qs-en/html-umbau_producer/producer/ -type f -exec sed -n '/verified.<\/span><br>.+<\/div>' {} + > verified.txt
meckert er anders --> sed: -e expression #1, char 31: unterminated address regex

Ich weiß nicht wo ich was nicht "terminiert habe. Kannst du mir da vielleicht noch mal kurz unter die Arme greifen?

Viele Grüße und Danke vorab
Andreas

tobo
Beiträge: 2298
Registriert: 10.12.2008 10:51:41

Re: suche mit grep oder find und Regular Expression

Beitrag von tobo » 20.11.2024 20:22:49

derilzemer hat geschrieben: ↑ zum Beitrag ↑
20.11.2024 20:02:56
Jetzt habe ich gedacht den String so zu "bauen"

Code: Alles auswählen

 find /volume1/web/quartette/qs-en/html-umbau_producer/producer/ -type f -exec sed -n '/verified/{<\/span><br>.+<\/div>}' {} + > verified.txt 
Das ist auch weitestgehend richtig, allerdings kann GNU-sed den Quantifizierer + nur im extended-Modus. Also entweder rufst du mit "sed -En" auf oder du verwendest in der RegEx anstatt ".+" eben "..*". Wobei, wenn Zeile 44 wirklich fix ist, dann kannste die natürlich auch direkt adressieren.

EDIT: Ich sehe gerade, dass die Abgrenzungen nicht ganz stimmten:

Code: Alles auswählen

 
find /volume1/web/quartette/qs-en/html-umbau_producer/producer/ -type f -exec sed -En '/verified/{/<\/span><br>.+<\/div>/p}' {} + >verified.txt 
Die {} und + stehen für die Übergabe des find-Suchergebnisses an den exec-Part. Die {} stehen für den Dateiparameter und das + gibt an, dass alle Dateinamen direkt im Ganzen als Argumentliste übergeben werden anstatt mit \; jedes Dateinamenargument einzeln zu übergeben.

Liffi
Beiträge: 2328
Registriert: 02.10.2004 01:33:05

Re: suche mit grep oder find und Regular Expression

Beitrag von Liffi » 20.11.2024 20:48:14

Zunächst mal: Bitte nicht HTML mit regex parsen, das geht schief ;-).

Wenn ich dich richtig verstehe, möchtest du alle Dateinamen haben, in denen die 10. Zeile nicht auskommentiert ist und das Wort Variante enthält:

Code: Alles auswählen

for file in *; do
 if [ -f "$file" ]; then
 awk 'NR == 10' "$file" | rg --pcre2 -q '(?!.*<--).*Variante' && echo "$file matches" || echo "$file does not match"
 fi
done
Ich nutze hier `rg` statt `grep`, aber das kann man vermutlich auch umbauen wenn man möchte. Im Prinzip gehe ich über alle Dateien, nehme mir Zeile 10, checke ob `Variante` drin vorkommt, aber kein `<--` und gebe dann die Datei aus.
Ist es das, was du möchtest. Wenn du die Zeile ausgeben möchtest, kann du natürlich auch einfach das `-q` wegnehmen und die echos dahinter.

Benutzeravatar
derilzemer
Beiträge: 25
Registriert: 05.11.2004 22:55:09

Re: suche mit grep oder find und Regular Expression

Beitrag von derilzemer » 20.11.2024 22:46:23

Hallo,
danke auch für deine Antwort.
Bitte nicht HTML mit regex parsen, das geht schief
Jo, da bin ich absoluter Newbie in der Ecke, also muss ich deine Aussage als Tipp & Anregung erst mal so hinnehmen :THX:
Mit deinem Script habe ich alle Fragen der Welt, schließlich sollte ich es einigermaßen verstehen wie es funktioniert.

Die beiden Beispiel wo ich ToBo unterstützt hat funktionieren grundsätzlich, habe aber jetzt nach deinem Hinweis noch mal in das Ergebnis reingeschaut und festgestellt dass eines nicht ganz richtig und das andere nicht nach Wunsch läuft. Das mit dem Wunsch ist, dass ich nicht weiß aus welcher Datei das ist. Wenn ich als mit grep "suche" bekomme ich da immer den Dateipfad mit, das habe ich vergessen zu sagen, sorry. Den brauch ich bei 4000 Dateien und 1500 möglichen Treffern, damit ich weiß wo das ist wenn ich an den Texten die er filtert auch Änderungen vornehmen kann.
Beispiel:

Code: Alles auswählen

/volume1/web/quartette/qs-en/SED_change/ass.html:23: An den nicht im einzelnen definierten Spielkartenbildern mit "Auto- und Technik Quartetten" .......
Da habe ich dann den Dateinamen drin und das passt für mich.
  • Muss ich in deinem Script in

    Code: Alles auswählen

    for file in *
    für den * den Pfad mitgeben z.B.

    Code: Alles auswählen

    for file in /volume1/web/quartette/qs/producer/; do
    definieren?
  • In meinen Templates ist die gesuchte Zeile die 45, 10 war es nur hier im Forum, ergo muss ich das einfach nur anpassen im Script.
  • wenn Ausgabe, dann q weg und die Echos dahin, also dann so?

    Code: Alles auswählen

    rg --pcre2 && echo "$file matches" || echo "$file does not match" '(?!.*<--).*Variante'
Sorry der Fragen wegen, aber das ist leider meinem Wissensstand in Sachen Scripten und dem geschuldet, dass ich mit 60 nimmer auf den Stand eines erfahrenen proggers komme :( .
Zum Abschluss noch die Frage, ob ich das mit > in eine Datei übergeben kann und wo ob ich das so im Script platzieren muss

Code: Alles auswählen

rg --pcre2 && echo "$file matches" || echo "$file does not match" '(?!.*<--).*Variante' > datei.txt
mfG
A. Müller

tobo
Beiträge: 2298
Registriert: 10.12.2008 10:51:41

Re: suche mit grep oder find und Regular Expression

Beitrag von tobo » 20.11.2024 23:31:20

derilzemer hat geschrieben: ↑ zum Beitrag ↑
20.11.2024 22:46:23
Die beiden Beispiel wo ich ToBo unterstützt hat funktionieren grundsätzlich, habe aber jetzt nach deinem Hinweis noch mal in das Ergebnis reingeschaut und festgestellt dass eines nicht ganz richtig und das andere nicht nach Wunsch läuft. Das mit dem Wunsch ist, dass ich nicht weiß aus welcher Datei das ist. Wenn ich als mit grep "suche" bekomme ich da immer den Dateipfad mit, das habe ich vergessen zu sagen, sorry. Den brauch ich bei 4000 Dateien und 1500 möglichen Treffern, damit ich weiß wo das ist wenn ich an den Texten die er filtert auch Änderungen vornehmen kann.
Wo fehlt der Wunsch, im 1., im 2. oder bei beiden?

Code: Alles auswählen

(1) find /volume1/web/quartette/qs-en/html-umbau_producer/producer/ -type f -exec grep -P '^(?!\s*<!--).*Variant' {} +
(2) find /volume1/web/quartette/qs-en/html-umbau_producer/producer/ -type f -exec grep -E 'verified.*</span><br>.+</div>' {} + >verified.txt
Und was ist nicht ganz richtig?

Grundsätzlich ist der HTML-Hinweis von Liffi richtig, das kann schnell scheitern. Wenn das aber fixer, unverschachtelter und zeilenorientierter Text vorliegt, dann geht das sehr wohl.

EDIT: RegEx auf aktuelle Anforderung aktualisiert
Zuletzt geändert von tobo am 28.11.2024 23:30:25, insgesamt 2-mal geändert.

Liffi
Beiträge: 2328
Registriert: 02.10.2004 01:33:05

Re: suche mit grep oder find und Regular Expression

Beitrag von Liffi » 21.11.2024 06:50:46

derilzemer hat geschrieben: ↑ zum Beitrag ↑
20.11.2024 22:46:23
Hallo,
danke auch für deine Antwort.
Bitte nicht HTML mit regex parsen, das geht schief
Jo, da bin ich absoluter Newbie in der Ecke, also muss ich deine Aussage als Tipp & Anregung erst mal so hinnehmen :THX:
Ja, alles gut. Am Ende hast du ja wirklich ein Muster und mehr oder weniger nur eine Zeile, die du anschauen musst. Das ist vielleicht noch vertretbar. Aber sonst geht meine Empfehlung immer zu einem HTML/XML Parser, dem man dann schlaue Fragen stellen kann. Vielleicht machen wir es das nächste Mal mit `xmlstarlet` oder so ;-).
  • Muss ich in deinem Script in

    Code: Alles auswählen

    for file in *
    für den * den Pfad mitgeben z.B.

    Code: Alles auswählen

    for file in /volume1/web/quartette/qs/producer/; do
    definieren?
Der * ist wichtig, der trifft einfach jede Datei. In deinem Beispiel dann:

Code: Alles auswählen

for file in /volume1/web/quartette/qs/producer/*; do
, also jede Datei in diesem Ordner.
  • In meinen Templates ist die gesuchte Zeile die 45, 10 war es nur hier im Forum, ergo muss ich das einfach nur anpassen im Script.
Ja, ganz genau. Voraussetzung ist natürlich, dass es wirklich immer nur die eine Zeile ist.
  • wenn Ausgabe, dann q weg und die Echos dahin, also dann so?

    Code: Alles auswählen

    rg --pcre2 && echo "$file matches" || echo "$file does not match" '(?!.*<--).*Variante'
Wenn du nur die matching files möchtest würdest du eher sowas machen:

Code: Alles auswählen

 rg --pcre2 '(?!.*<--).*Variante' && echo $file
 
Dann bekommst du eine Zeile mit dem Treffer und eine mit dem Dateinamen. das

Code: Alles auswählen

echo "$file does not match"
würde auch kommen, wenn die Datei nicht getroffen wurde, aber die Ausgabe ist dir ja wahrscheinlich egal ;-).
Sorry der Fragen wegen, aber das ist leider meinem Wissensstand in Sachen Scripten und dem geschuldet, dass ich mit 60 nimmer auf den Stand eines erfahrenen proggers komme :( .
Überhaupt kein Problem, wir alle können noch viel lernen :-).
Zum Abschluss noch die Frage, ob ich das mit > in eine Datei übergeben kann und wo ob ich das so im Script platzieren muss

Code: Alles auswählen

rg --pcre2 && echo "$file matches" || echo "$file does not match" '(?!.*<--).*Variante' > datei.txt
Habe noch einen kleinen Fehler gefunden, aber das hier müsste eigentlich gehen:

Code: Alles auswählen

for file in /volume1/web/quartette/qs/producer/*; do
 if [ -f "$file" ]; then
 awk 'NR == 45' "$file" | rg --pcre2 '^(?!.*<--).*Variante' && echo $file
 fi
done > datei.txt

tobo
Beiträge: 2298
Registriert: 10.12.2008 10:51:41

Re: suche mit grep oder find und Regular Expression

Beitrag von tobo » 21.11.2024 09:21:39

Die RegEx muss dabei aber anders lauten, z.B.: '^(?!<!--).*Variante'.

Liffi
Beiträge: 2328
Registriert: 02.10.2004 01:33:05

Re: suche mit grep oder find und Regular Expression

Beitrag von Liffi » 21.11.2024 14:36:05

tobo hat geschrieben: ↑ zum Beitrag ↑
21.11.2024 09:21:39
Die RegEx muss dabei aber anders lauten, z.B.: '^(?!<!--).*Variante'.
Oh ja, du hast Recht, meins trifft auf <-- statt auf <!--.

mino23
Beiträge: 72
Registriert: 15.07.2019 18:49:51

Re: suche mit grep oder find und Regular Expression

Beitrag von mino23 » 21.11.2024 21:34:47

Ja, das ist der neue Trend die eigenen Webseiten in zwei oder drei Sprachen auszuliefern. Von der Sinnhaftigkeit dieses Unterfangen bin ich allerdings nicht überzeugt. Das ist sehr ambitiös. Vor allem wenn ich mir anschaue welche Inhalte angeboten werden. Besonders verbreitet ist das bei den sogenannten SSG, also "hugo" und Consorten.

Benutzeravatar
derilzemer
Beiträge: 25
Registriert: 05.11.2004 22:55:09

Re: suche mit grep oder find und Regular Expression

Beitrag von derilzemer » 24.11.2024 21:48:36

Hallo Mino23,

ich will und muss mich ja nicht verteidigen in dem was ich tue, aber solche Kommentare wie der deinige ändern meine Einstellung dazu. Also gebe ich zumindest eine Antwort darauf.

Bei mir kann man wohl nicht von Trend reden wenn ich mich dem Thema 2 sprachig nach 6 Jahren widme. Ist es ambitioniert? Sicherlich. Was bezwecke ich damit? Ich bewege mich mit meinem Portal
in einem sehr kleinen und spezifischen Sammlerbereich, der ebenso wenige noch aktive Sammler hat. Haupthintergrund ist die Dokumentation des Ganzen. Ebenso denke ich, dass du die "Sinnhaftigkeit" nicht einschätzen musst bzw. kannst, da es sich hier eben NICHT um "Standards" handelt. Ich nutze einen simplen Sublime Editor und kein Hugo und Konsorten wie von dir vermutet, klimpere alles via Hand in schnödem HTML und vereinzelt PHP. Durch die Templates habe ich mir natürlich Arbeitserleichterung geschaffen, warum auch nicht bei 4000 Einzelseiten.
Vor allem wenn ich sehe welche Inhalte angeboten werden
Das hast du anhand was einschätzen können als großer Kenner der Szene? Anhand der Auszüge aus dem HTML-Templates? Ich betreibe das ganze mit der gleichen Intention wie ich das Portal vor 6 Jahren online genommen habe. Ich finde es zumindest super, dass es hier Leute hat, die versuchen zu helfen und nicht von vorneherein wie es in der Wirtschaft Gang und gebe ist Projekte im Vorfeld durch unqualifiziertes Gerede zum scheitern zu bringen.

@Liff und tobo
Ich bin noch nicht dazu gekommen eure Hilfe zu testen, aber werde das natürlich sobald wie möglich machen und auch noch mal hier kundtun ob das so läuft wie ich es benötige. Danke

Viele Grüße
Andreas

Benutzeravatar
derilzemer
Beiträge: 25
Registriert: 05.11.2004 22:55:09

Re: suche mit grep oder find und Regular Expression

Beitrag von derilzemer » 24.11.2024 22:24:36

Hallo @Liffi,

hab gedacht ich mach mal "schnell" einen Testlauf vor Bett gehen. Wie immer, gnadenlos an die Wand gefahren schon wegen rg :(

Code: Alles auswählen

for file in /volume1/web/quartette/qs/producer/*; do
 if [ -f "$file" ]; then
 awk 'NR == 45' "$file" | rg --pcre2 '^(?!.*<!--).*Variante' && echo $file
 fi
done > variantenblock-de-aktiv.txt

search_variant.sh: line 8: rg: command not found
rg ist rgrep oder was genau ist es? Ich arbeite hier mein Zeugs auf einer Synology ab, die ja ein wenig "abgespeckt" ist was die Mittel und Tools angeht, nicht alles ist verfügbar. Ich kann natürlich auch auf ein vollwertiges Debian zugreifen, da kann ich dann sicherlich "rg" installieren, wenn ich weiß ob es rgrep ist. Sorry wegen der Nachfrage.
Wenn ich schon dabei bin, dann stelle ich noch meine 2. Frage. Ich hatte ja angedeutet, dass ich 2 Dinge auslesen muss.

Code: Alles auswählen

for file in /volume1/web/quartette/qs/producer/*; do
 if [ -f "$file" ]; then
 awk 'NR == 44' "$file" | rg --pcre2 'verifiziert.<\/span><br>.+<\/div>' && echo $file
 fi
done > verifiziert-de_z44.txt
das

Code: Alles auswählen

verifiziert.<\/span><br><\/div>
ist unique in Zeile 44, nur dass ich einzig die haben will, wo ein Eintrag zwischen <br></div> beinhalten, das kann auch allerlei Sein was da drin steht. Passt das aus deiner Sicht?

Gruß Andreas

Liffi
Beiträge: 2328
Registriert: 02.10.2004 01:33:05

Re: suche mit grep oder find und Regular Expression

Beitrag von Liffi » 27.11.2024 07:06:40

derilzemer hat geschrieben: ↑ zum Beitrag ↑
24.11.2024 22:24:36
hab gedacht ich mach mal "schnell" einen Testlauf vor Bett gehen. Wie immer, gnadenlos an die Wand gefahren schon wegen rg :(

Code: Alles auswählen

for file in /volume1/web/quartette/qs/producer/*; do
 if [ -f "$file" ]; then
 awk 'NR == 45' "$file" | rg --pcre2 '^(?!.*<!--).*Variante' && echo $file
 fi
done > variantenblock-de-aktiv.txt

search_variant.sh: line 8: rg: command not found
rg ist rgrep oder was genau ist es? Ich arbeite hier mein Zeugs auf einer Synology ab, die ja ein wenig "abgespeckt" ist was die Mittel und Tools angeht, nicht alles ist verfügbar. Ich kann natürlich auch auf ein vollwertiges Debian zugreifen, da kann ich dann sicherlich "rg" installieren, wenn ich weiß ob es rgrep ist. Sorry wegen der Nachfrage.
Es geht natürlich auch ohne rg (ripgrep):

Code: Alles auswählen

for file in /volume1/web/quartette/qs/producer/*; do
 if [ -f "$file" ]; then
 awk 'NR == 45' "$file" | grep -P '^(?!.*<!--).*Variante' && echo $file
 fi
done > variantenblock-de-aktiv.txt
Das grep -P ist das Äquivalent dafür.
Wenn ich schon dabei bin, dann stelle ich noch meine 2. Frage. Ich hatte ja angedeutet, dass ich 2 Dinge auslesen muss.

Code: Alles auswählen

for file in /volume1/web/quartette/qs/producer/*; do
 if [ -f "$file" ]; then
 awk 'NR == 44' "$file" | rg --pcre2 'verifiziert.<\/span><br>.+<\/div>' && echo $file
 fi
done > verifiziert-de_z44.txt
das

Code: Alles auswählen

verifiziert.<\/span><br><\/div>
ist unique in Zeile 44, nur dass ich einzig die haben will, wo ein Eintrag zwischen <br></div> beinhalten, das kann auch allerlei Sein was da drin steht. Passt das aus deiner Sicht?
Ja, .+ wird nu anschlagen, wenn es mindestens ein Zeichen zwischen dem br> und dem </div sind.Hätte behauptet, man muss / gar nicht escapen, aber schaden tut es auch nicht.

Benutzeravatar
derilzemer
Beiträge: 25
Registriert: 05.11.2004 22:55:09

Re: suche mit grep oder find und Regular Expression

Beitrag von derilzemer » 28.11.2024 16:49:20

Hi Liffi,

danke für die Antwort. Ich habe es mit ripgrep gemacht, bin dazu auf meine Linuxbüchse, da konnte ich es installieren. Also ausführen passt alles, aber ich habe "keinen Ertrag, die Datei hat 0 byte Inhalt. Ich denke ich weiß auch woran es liegt. Das ^ in

Code: Alles auswählen

'^(?!.*<!--)
steht ja für Zeilenanfang, das habe ich dann eben nicht bedacht. Das <!-- steht zwar am Anfang der Zeile, die ist aber um 4 Tabs eingerückt. Das muss sicher auch berücksichtigt werden, oder? Wenn ja, dann habe ich das natürlich fehlinterpretiert was Zeilenanfang angeht. Wenn es mit in den String

Code: Alles auswählen

'^(?!.*<!--)
rein muss, wie definiert man da Tabs oder z.B. 3 oder wie viele spaces auch immer? spaces kann ja durchaus auch mal vorkommen, wenn man vergessen hat mit Tab zu arbeiten. Zum Glück habe ich auch hier den Template Standard, 4 Tabs. Aber gut auch zu wissen, wie man mit spaces umgehen müsste.

Viele Grüße
Andreas

Liffi
Beiträge: 2328
Registriert: 02.10.2004 01:33:05

Re: suche mit grep oder find und Regular Expression

Beitrag von Liffi » 28.11.2024 17:48:51

derilzemer hat geschrieben: ↑ zum Beitrag ↑
28.11.2024 16:49:20
danke für die Antwort. Ich habe es mit ripgrep gemacht, bin dazu auf meine Linuxbüchse, da konnte ich es installieren. Also ausführen passt alles, aber ich habe "keinen Ertrag, die Datei hat 0 byte Inhalt. Ich denke ich weiß auch woran es liegt. Das ^ in

Code: Alles auswählen

'^(?!.*<!--)
steht ja für Zeilenanfang, das habe ich dann eben nicht bedacht. Das <!-- steht zwar am Anfang der Zeile, die ist aber um 4 Tabs eingerückt. Das muss sicher auch berücksichtigt werden, oder? Wenn ja, dann habe ich das natürlich fehlinterpretiert was Zeilenanfang angeht. Wenn es mit in den String

Code: Alles auswählen

'^(?!.*<!--)
rein muss, wie definiert man da Tabs oder z.B. 3 oder wie viele spaces auch immer? spaces kann ja durchaus auch mal vorkommen, wenn man vergessen hat mit Tab zu arbeiten. Zum Glück habe ich auch hier den Template Standard, 4 Tabs. Aber gut auch zu wissen, wie man mit spaces umgehen müsste.
Du hast völlig recht, ich ging von Zeilenanfang aus. Whitespace beliebiger Länge müsste sich mit \s* "erschlagen" lassen. Damit wäre beliebige Länge, also auch Länge 0 erlaubt.

tobo
Beiträge: 2298
Registriert: 10.12.2008 10:51:41

Re: suche mit grep oder find und Regular Expression

Beitrag von tobo » 28.11.2024 18:42:38

Liffi hat geschrieben: ↑ zum Beitrag ↑
28.11.2024 17:48:51
derilzemer hat geschrieben: ↑ zum Beitrag ↑
28.11.2024 16:49:20
danke für die Antwort. Ich habe es mit ripgrep gemacht, bin dazu auf meine Linuxbüchse, da konnte ich es installieren. Also ausführen passt alles, aber ich habe "keinen Ertrag, die Datei hat 0 byte Inhalt. Ich denke ich weiß auch woran es liegt. Das ^ in

Code: Alles auswählen

'^(?!.*<!--)
steht ja für Zeilenanfang, das habe ich dann eben nicht bedacht. Das <!-- steht zwar am Anfang der Zeile, die ist aber um 4 Tabs eingerückt. Das muss sicher auch berücksichtigt werden, oder? Wenn ja, dann habe ich das natürlich fehlinterpretiert was Zeilenanfang angeht. Wenn es mit in den String

Code: Alles auswählen

'^(?!.*<!--)
rein muss, wie definiert man da Tabs oder z.B. 3 oder wie viele spaces auch immer? spaces kann ja durchaus auch mal vorkommen, wenn man vergessen hat mit Tab zu arbeiten. Zum Glück habe ich auch hier den Template Standard, 4 Tabs. Aber gut auch zu wissen, wie man mit spaces umgehen müsste.
Du hast völlig recht, ich ging von Zeilenanfang aus. Whitespace beliebiger Länge müsste sich mit \s* "erschlagen" lassen. Damit wäre beliebige Länge, also auch Länge 0 erlaubt.
Kann es sein, dass ihr beide nicht versteht, was diese RegEx bedeutet? Diese 4 Tabs werden durch das .*, was Liffi zu meiner RegEx oben ergänzt hat, bereits gefunden. Da könnte jetzt noch zusätzlich das Vaterunser vorne dran stehen, dann würde das immer noch negativ matchen.

Liffi
Beiträge: 2328
Registriert: 02.10.2004 01:33:05

Re: suche mit grep oder find und Regular Expression

Beitrag von Liffi » 28.11.2024 19:43:39

tobo hat geschrieben: ↑ zum Beitrag ↑
28.11.2024 18:42:38
Kann es sein, dass ihr beide nicht versteht, was diese RegEx bedeutet? Diese 4 Tabs werden durch das .*, was Liffi zu meiner RegEx oben ergänzt hat, bereits gefunden. Da könnte jetzt noch zusätzlich das Vaterunser vorne dran stehen, dann würde das immer noch negativ matchen.
Du hast natürlich völlig recht. Wir sollten vielleicht mal zwei oder drei konkrete Zeilen anschauen, von denen der Thread Opener glaube, sie sollen getroffen werden (oder halt nicht). Dann schauen wir dann noch mal woran es hakt.

Benutzeravatar
derilzemer
Beiträge: 25
Registriert: 05.11.2004 22:55:09

Re: suche mit grep oder find und Regular Expression

Beitrag von derilzemer » 28.11.2024 22:30:58

Hallo Tobo, Liffi,

ja, den RegEx habe ich dann nicht korrekt verstanden, da gibt es keinen Zweifel, es kann also nicht sein, es ist wohl so, zumindest was mich angeht :(
Ich paste mal direkt das 1:1 hier rein wie das in dem HTML Template aussieht:

Code: Alles auswählen

	<input type="radio" id="nav-collapse" name="nav" checked="checked" class="invis"/>
		<main class="main-base">
			<div class="content"><br><br>
			<h3>3205 - 1972</h3>
			<h2>Panzer</h2><br>
			<!-- <h3>Untertitel</h3><br>
			<h3>Spielkarten 1a-3d</h3> -->
			<p><div class="copyright">Kartenbilder: &copy; 2017 Verlag Altenburger Spielkarten</div></p>
			<!-- <p><div class="copyright">Kartenbilder: &copy; 2017 Wiener Spielkartenfabrik Ferd. Piatnik &amp; Söhne</div></p>
			<p><div class="copyright">&copy; NORIS-SPIELE Georg Reulein GmbH &amp; Co. KG</div></p> -->
			<div class="info-item-cap"><u>Zusatzinfo:</u></div>
Zeile 44		<div class="info-item"><span class="yellow">Das Spiel ist geprüft &amp; verifiziert.</span><br>Der identische Kartensatz wurde auch wieder in <a href="../penny/g_3205-7_pen76.html">3205/7-1976</a> verwendet. Von diesem Spiel existiert auch eine Rückseiten-Variante.</div>
Zeile 45		<!-- <h3>3205 - 1972 (Variante A - Schachtel-Deckblatt)</h3>
			<h2>Panzer</h2><br>
			<h3>Untertitel</h3><br>
			<h3>Spielkarten 1a-3d</h3>
			<p><div class="copyright">Kartenbilder: &copy; 2017 Verlag Altenburger Spielkarten</div></p>
			<p><div class="copyright">Kartenbilder: &copy; 2017 Wiener Spielkartenfabrik Ferd. Piatnik &amp; Söhne</div></p>
			<p><div class="copyright">&copy; NORIS-SPIELE Georg Reulein GmbH &amp; Co. KG</div></p>
			<div class="info-item-cap"><u>Zusatzinfo:</u></div>
			<div class="info-item"><span class="yellow">Das Spiel ist geprüft &amp; verifiziert.</span><br></div> -->
Ich habe jetzt zu den relevanten Zeilen die Nummer dazugeschrieben. Braucht man noch Infos zu irgend etwas?
Nochmal zum bisherigen Verlauf: Nachdem ich das aktuelle Script ausführe ist er relativ schnell fertig, keine Fehlermeldung und die Datei ist auch angelegt, wie gesagt 0 byte, also leer. Was mir noch einfällt ist, dass im ursprünglichen Script die Dateien /quartette/qs/producer/* erwartet wurden. Da habe ich natürlich auch nicht geschaltet, da die HTML files in weiteren Unterverzeichnissen liegen. Da ich ja verschiedene Verlage und Serien habe sieht ein Pfad zur HTML Dat so auus:
/mnt/web/quartette/qs/producer/ass/bt70/html-files

Ich habe deshalb das Script so mal angepasst:

Code: Alles auswählen

for file in /mnt/web/quartette/qs/producer/ass/bt70/*; do
 if [ -f "$file" ]; then
 awk 'NR == 45' "$file" | rg --pcre2 '^(?!.*<!--).*Variante' && echo $file
 fi
done > variantenblock-de-aktiv.txt
Das Ergebnis war allerdings das gleiche. Die Datei hatte keinen Inhalt :?
Wenn ihr noch irgendwelche Infos benötigt, dann liefere ich die natürlich.

Viele Grüße Andreas

tobo
Beiträge: 2298
Registriert: 10.12.2008 10:51:41

Re: suche mit grep oder find und Regular Expression

Beitrag von tobo » 28.11.2024 23:24:37

Dass die Datei 0 Bytes hat ist für das (1-Zeilen-)Beispiel richtig, schließlich greift die RegEx und damit ist Zeile 45 richtigerweise nicht in der Ausgabedateidatei. Falls im angegebenen Verzeichnis weitere Dateien liegen:
-Ist die relevante Zeile in allen Dateien die 45.?
-Steht überall noch "Variante" anstatt "Variant" in dieser Zeile?

Die Schleifenlösung schaut - im Gegensatz zu den verschmähten Find-Lösungen - nicht rekursiv in die Unterverzeichnisse. Sollen die ebenfalls durchsucht werden, dann musst du diese Verzeichnisse entweder einzeln angeben oder durchsuchst die Verzeichnisquelle direkt rekursiv:

Code: Alles auswählen

shopt -s globstar dotglob
for file in <DIR>/**/*; do
    if [ -f "$file" ]; then
...    
Für mich soll es das jetzt hier auch gewesen sein. Good luck...

Liffi
Beiträge: 2328
Registriert: 02.10.2004 01:33:05

Re: suche mit grep oder find und Regular Expression

Beitrag von Liffi » 29.11.2024 07:26:34

derilzemer hat geschrieben: ↑ zum Beitrag ↑
28.11.2024 22:30:58
Ich habe jetzt zu den relevanten Zeilen die Nummer dazugeschrieben. Braucht man noch Infos zu irgend etwas?
Kannst du meine Variante mal mit einer einzigen Datei versuchen, die in Zeile 45 *nicht* auskommentiert ist?
Was mir noch einfällt ist, dass im ursprünglichen Script die Dateien /quartette/qs/producer/* erwartet wurden. Da habe ich natürlich auch nicht geschaltet, da die HTML files in weiteren Unterverzeichnissen liegen. Da ich ja verschiedene Verlage und Serien habe sieht ein Pfad zur HTML Dat so auus:
/mnt/web/quartette/qs/producer/ass/bt70/html-files
Man kann natürlich auch sagen, wir nehmen alle html Dateien, z.B. so:

Code: Alles auswählen

for file in /mnt/web/quartette/qs/producer/**/*.html; do
 if [ -f "$file" ]; then
 awk 'NR == 45' "$file" | rg --pcre2 '^(?!.*<!--).*Variante' && echo $file
 fi
done > variantenblock-de-aktiv.txt
Vorher muss man evtl shopt -s globstar ausführen, damit ** rekursiv in alle Unterverzeichnisse geht. In diesem code snippet wird erwartet, dass die HTML Dateien alle auf .html enden, falls das nicht so ist, muss man natürlich den Matcher anpassen.

Benutzeravatar
derilzemer
Beiträge: 25
Registriert: 05.11.2004 22:55:09

[GELÖST] Re: suche mit grep oder find und Regular Expression

Beitrag von derilzemer » 30.11.2024 14:21:25

Hallo @Tobo

selbstverständlich habe ich in Zeile 45 in den 3500 html Dateien vorkommen mit und ohne das <!--
Ja, ist es IMMER Zeile 45 und ich habe nur Variante da stehen, da ich in den "DE" Ordnerstrukturen das Script gestartet habe.
Deinem letzten Satz nach scheinst du verärgert zu sein, was sicherlich nicht meine Absicht war.

@Liffi

Es lag schlicht und ergreifend am rekursiven. Ich habe das mal wegen dem Pfad angepasst und schon ging es genauso wie ich es benötige.

DE: /mnt/web/quartette/qs/producer/**/**/*.html
EN: /mnt/web/quartette/qs-en/html-umbau_producer/producer/**/**/*.html

Ingesamt habe ich jetzt 6 Dats mit roundabout 1,2 MB

Danke an euch beide, letztendlich war es das beste aus beiden Wissenswelten. Danke :THX:

Viele Grüße aus der Pfalz
Andreas

mino23
Beiträge: 72
Registriert: 15.07.2019 18:49:51

Re: suche mit grep oder find und Regular Expression

Beitrag von mino23 » 30.11.2024 14:31:46

Hallo @derilzemer,

wie geht's?

Zum Thema:

Es gibt außerhalb von augenscheinlich sehr simplen Lösungen wie find/grep ganz tolle Programme mit denen Du eine Suchfunktion - static search library - in Deine statischen Seiten einbauen kannst. Gerade unter Linux läßt sich das super toll und einfach realisieren, weil bereits unzählige fertige Lösungen existieren. Lösungen mit find und grep und oder loops sind immer mit üblen Frikkeleien verbunden. Du erlebst es gerade. Mit einer fertigen Suchfunktion kannst Du das wunderbar vermeiden. Je nach Anspruch gibt es einfache und sehr anspruchsvolle Suchfunktionen. Andere Funktionen sind wieder - relativ gesehen - sehr langsam und andere sehr schnell was das Auswerfen der Suchergebnissen betrifft. Die Zeit die Du jetzt in grep investiert hast, die hätte ich in die Suche nach einer fertigen Suchfunktion gesteckt. Vielleicht reicht bereits eine der im Zusammenhang mit dem erwähnten HUGO verwendeten Suchlösungen. Die basieren alle auf Javascript.

Das war jetzt wieder nur meine Meinung. :)

Antworten