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

Printed on: April 19, 2024 at 05:04 o'clock

Member: Lochkartenstanzer
Solution Lochkartenstanzer Aug 24, 2019 updated at 06:33:11 (UTC)
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.
Member: nekron
nekron Aug 24, 2019 updated at 06:39:06 (UTC)
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.
Member: Lochkartenstanzer
Lochkartenstanzer Aug 24, 2019 at 06:48:24 (UTC)
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
Solution 140913 Aug 24, 2019 updated at 08:20:22 (UTC)
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/
Member: nekron
nekron Aug 24, 2019 at 08:31:20 (UTC)
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
Solution 140913 Aug 24, 2019 updated at 09:02:50 (UTC)
Goto Top
Member: nekron
nekron Aug 24, 2019 updated at 13:32:18 (UTC)
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 Aug 24, 2019 updated at 13:50:16 (UTC)
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.
Member: nekron
nekron Aug 24, 2019 updated at 15:21:51 (UTC)
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 ?