sed ersetzt nur ersten String pro Zeile

FatManStanding

Lt. Junior Grade
Registriert
Aug. 2021
Beiträge
385
Hallo,

ich will Zeichen zwischen <sub>- oder <sup>-Tags durch andere Zeichen ersetzen. Es kommt vor, dass in den Tags noch weitere Zeichen stehen. Das sieht dann so aus:

Code:
sed -i 's/<sub>2\(.*\)<\/sub>/<sub>AAA\1<\/sub>/g' neu.txt

In dem Fall soll eine 2 innerhalb eines <sub>-Tags durch 'AAA' ersetzt werden (das ist sinnlos, es geht nur um das Prinzip). Das geht allers grds., es wird aber immer nur das erste gefundene Muster pro Zeile ersetzt. Führe ich das ganze ein zweites mal für die geänderte Datei aus, wird das zweite gefundene Muster ersetzt, weil es ja in dem zweiten Durchlauf das erste pro Zeile ist. Wieso wird immer nur das erste ersetzt? Wenn ich einfach irgendein Zeichen ersetzte und kein Regex verwende wird alles ersetzt.

FMS

Edit
Wenn der Text z. B. so aussieht

<sub>23 </sub> bez <sub>23 </sub> bez
<sub>23 </sub> bez <sub>23 </sub> bez

findet sed nicht nur "<sub>23 </sub>" sondern "<sub>23 </sub> bez <sub>23 </sub>". Ich kenne gierige und nicht gierige Suchen nur i.V.m. Regex, also ".?" statt ".".
 
Naja das ist ja eigentlich erst mal ganz normales Verhalten denke ich

Ein Weg wäre z.B. das wenn möglich mehr einzugrenzen


Also in obigem Beispiel - nur mal als Beispiel

Code:
echo "<sub>23 </sub> bez <sub>23 </sub> bez" | sed 's/<sub>[0-9]* <\/sub>/<sub>AAA<\/sub>/g'
das liefert dann
<sub>AAA</sub> bez <sub>AAA</sub> bez


Das Problem ist halt <sub>.*</sub>deckt ALLES was zwischen dem ersten <sub> und dem letzten </sub> steht als 1 Brocken ab also auch alle <sub>, </sub> dazwischen
 
Zuletzt bearbeitet:
Sed arbeitet schon immer nur zeilenweise. Wichtig sind einige Optionen wie das g am Ende für global.

Historisch hat mal Zeilen gelesen und dann durch einen Pipe gejagt mit einem sed oder awk hinterher.
 
Zuletzt bearbeitet:
Also ich hab das mal kurz allgemeiner gemacht, das sollte alles zwischen Tags ersetzen

Also einfach zu sagen das "</" gehört nicht mehr zu dem Teil in den Tag sondern ist das Tag-Blockende

Sed kennt ja nicht die "Klammerfunktion" von Tags das erste <sub> im Text und das letzte </sub> sind alles was es sieht bei <sub>.*</sub>

Code:
echo "<sub>LALALALA</sub> bez <sub>Bananenbrotbackmaschine</sub> bez" |  sed 's/<sub>.[^<\/]*/<sub>AAA/g'

Ergebnis =>  <sub>AAA</sub> bez <sub>AAA</sub> bez
 
Zuletzt bearbeitet:
@ Bohnenhans

Sehe ich das korrekt, dass hiermit

Code:
sed 's/<sub>.[^<\/]*/<sub>AAA/g'

nach jedem '<sub>' gefolgt von irgendwas außer < und / gesucht wird?
 
es wird nach dem Text der mit "<sub>" beginnt und mit den nächsten darauffolgenden "</" aufhört gesucht

Denke das sollte funktionieren ausser natürlich im Text zwischen <sub>...</ kommt das vor

Bei verschachtelten Tags muste halt dann die "Abbruchbedingung" anpassen, musst halt mal testen ob das schon ausreichet.
 
Zuletzt bearbeitet:
/ ist ein Sonderzeiten. Ich würde hier lieber als Trenner ; verwenden.
Code:
sed 's;<sub>.[^</]*;<sub>AAA;g'
 
Zurück
Oben