nekron
Goto Top

Mittels SED Text ersetzen in Anführungszeichen

Moin …

bin nicht wirklich der SED/regex Mensch, vielleicht kann mir jemand auf die Schnelle Helfen face-smile

ich habe Quelldateien in denen Texte massiv ersetzt werden sollen, stehen alle in Anführungszeichen.

"ABC" -> "DEF"
"mit ABC den Text ersetzen" -> "mit DEF den Text ersetzen"

steht der Text nicht in Anführungszeichen soll dieser auch nicht ersetzt werden.
also

ABC -> ABC
mit..ABC.. -> mit..ABC..

kann ich dies mittels SED lösen ? SED dann mittels Script auf alle Dateien anzuwenden ist ja nicht das Problem, nur der SED Syntax face-smile

Danke euch & Gruss aus dem Urlaub

Content-Key: 488398

Url: https://administrator.de/contentid/488398

Ausgedruckt am: 19.03.2024 um 10:03 Uhr

Mitglied: Lochkartenstanzer
Lösung Lochkartenstanzer 24.08.2019 aktualisiert um 08:33:11 Uhr
Goto Top
Moin,

Zitat von @nekron:

"ABC" -> "DEF"
"mit ABC den Text ersetzen" -> "mit DEF den Text ersetzen"

kann ich dies mittels SED lösen ?

Ja! Was ist dss Problem?

sed -e "s:ABC:DEF:g"  datei.txt

Da gibt's Tutorials.

lks

PS: Die Anführungszeichen stören nicht wirklich.
Mitglied: nekron
nekron 24.08.2019 aktualisiert um 08:39:06 Uhr
Goto Top
Mein Problem - sorry hab ich vergessen zu erwähnen face-smile

Ohne Anführungszeichen soll nichts ersetzt werden.

also
ABC soll ABC bleiben.

hierzu habe ich auch die schnelle einfach nichts finden können oder an der falschen stelle gesucht.
Mitglied: Lochkartenstanzer
Lochkartenstanzer 24.08.2019 um 08:48:24 Uhr
Goto Top
https://www.gnu.org/software/sed/manual/html_node/The-_0022s_0022-Comman ...

Einfach die Referenzen nutzen,

Um die Teile zwischen Anführungszeichen und zu ersetzendem String zu erhalten.

lks
Mitglied: 140913
Lösung 140913 24.08.2019 aktualisiert um 10:20:22 Uhr
Goto Top
Zitat von @nekron:

Mein Problem - sorry hab ich vergessen zu erwähnen face-smile

Ohne Anführungszeichen soll nichts ersetzt werden.

also
ABC soll ABC bleiben.
Na dann schreib sie halt mit in dein Suchpattern face-smile https://regex101.com/r/2jiQ02/1/
Oder wie Lochkartenstanzer schon schreibt wenn da außer dem Suchstring noch mehr zwischen den Anführungszeichen steht benutze Submatches https://regex101.com/r/Kn6uKa/2/
Mitglied: nekron
nekron 24.08.2019 um 10:31:20 Uhr
Goto Top
Der zweite Vorschlag passt schon ziemlich - ich habe mit Regex noch nie was zu tun gehabt ... auf Anhieb nix gefunden - da stelle ich lieber ne frage als mich tot zu suchen.

Ich habe jetzt leider noch ne Ausnahme gefunden

„ABC.blafasel“ darf auch nicht ersetzt werden. Kann mir einer erklären wie ich das noch einbaue ? Sozusagen der nächste Buchstabe darf nicht ein Punkt sein?

Danke euch allen und Gruß von der Nordsee
Mitglied: 140913
Lösung 140913 24.08.2019 aktualisiert um 11:02:50 Uhr
Goto Top
Mitglied: nekron
nekron 24.08.2019 aktualisiert um 15:32:18 Uhr
Goto Top
Das kommt davon wenn man sich mit dem allen einfach zu wenig auseinandersetzt, es würde mir leider ne menge Arbeit ersparen face-smile

wenn ich das ganze nun als sed Kommando absetze wird nix mehr draus face-sad Ich bin anscheinend einfach zu blöd für sowas …

sed -r "s/("^"*)ABC(^.^"*"|")/\1DEF\2/g" test.txt

(
-r, --regexp-extended
use extended regular expressions in the script.
)

ergibt (ich glaube die Ursprungsdatei brauche ich nicht zu erläutern face-smile )

DEF
"DEF"
"istDEFtest"
"istDEF.test"

also im Prinzip das gleiche wie
sed -r "s/ABC/DEF/g" test.txt

Ich bin ratlos und verwundert face-smile Und danke euch beiden für eure Hilfestellung - ich peils einfach nicht!
Mitglied: 140913
140913 24.08.2019 aktualisiert um 15:50:16 Uhr
Goto Top
Joa ... wenns zum richtig kopieren noch nicht mal mehr reicht, dann ist Hopfen und Malz verloren.
sed -re 's/("[^"]*)ABC([^.][^"]*"|")/\1DEF\2/gi' test.txt >test2.txt  
Regex muss man selbst lernen, alles andere bringt einen nüscht viel weiter. Es ist wie es ist, wenn ich zum Angeln gehe werfe ich ja auch nicht erst mal ein Ölfass als Köder in den See face-big-smile.
Das kommt davon wenn man sich mit dem allen einfach zu wenig auseinandersetzt, es würde mir leider ne menge Arbeit ersparen
Dann nehme keine Aufträge an die du nicht erledigen kannst.
Mitglied: nekron
nekron 24.08.2019 aktualisiert um 17:21:51 Uhr
Goto Top
Stimmt - anders kann ich's im Moment auch nicht ausdrücken … einfach zu blöd, total überlastet und trotz Urlaub schon wieder Urlaubsreif

Wahrscheinlich kämpfe ich auch noch mit Windows dazu face-smile - das vergass ich zu erwähnen.

D:\>sed -re "s/("["]*)ABC([.]["]*"|")/\1DEF\2/gi" test.txt
sed: -e expression #1, char 39: unterminated `s' command

das ganze in einer Bash:

$ sed -re 's/("[^"]*)ABC([^.][^"]*"|")/\1DEF\2/gi' d:/test.txt
ABC
"DEF"
"istDEFtest"
"istABC.test"

wird wahrscheinlich am | liegen denke ich - vielleicht hast du da noch einen rat ?

Und nein - das hat mit einem Auftrag nichts zu tun - ich möchte nur einige händische Ersetzungen automatisieren - bisher hab ich das händisch gemacht - und ganz ehrlich noch nie mit SED gearbeitet.

So - wenn ich das Regex in eine File packe dann funktionierts auch unter Windows !

DANKE AN EUCH BEIDEN - YOU MADE MY DAY face-smile

Kann mir einer noch erklären wie es genau umgekehrt gelöst werden ? Alles ersetzen was nicht in Anführungszeichen steht ? Geht das auch ?