Linux sed - Buchstabe ersetzen, aber nicht innerhalb von Anführungszeichen?

... komplette Frage anzeigen

4 Antworten

Das geht mit awk sehr einfach, vorausgesetzt, deine Datei hat wirklich genau das Format, wie von dir beschrieben:

hallo "hallo"
hi "hi"
tach "tach"

Dann erhältst du mit dem Kommando ...

awk '{gsub(/[aiueo]/, "", $1); print $0}' data.txt

... so eine Ausgabe:

hll "hallo"
h "hi"
tch "tach"

Also es werden alle Vokale im ersten Wort ohne Anführungszeichen ersetzt. (Das war es doch, was du wolltest, oder?)

Falls du allerdings auch Daten mit Leerzeichen wie in dieser Form hast:

guten morgen "guten morgen"
guten tag "guten tag"

Dann bekommst du mit dem leicht abgewandelten (und der Übersichtlichkeit halber auf 3 Zeilen verteilten) Kommando ...

awk '-F"' \\\\\\\\
'{gsub(/[aiueo]/, "", $1); print $1"\\\\\\\\""$2"\\\\\\\\""}' \\\\\\\\
data.txt

... diese korrekte Ausgabe:

gtn mrgn "guten morgen"
gtn tg "guten tag"

Falls deine Datei mehrere Felder in Anführungszeichen enthält (evtl. sogar eine unterschiedliche Anzahl pro Zeile), wird es etwas länger, ist aber noch relativ überschaubar.

tl;dr ... Finale und universelle Lösung:

Eine Datei mit dem Inhalt ...

eins zwei "drei" vier "fuenf sechs"
sieben "acht neun" zehn

... kannst du durch dir ein AWK-Skript mit ...

#!/usr/bin/awk -f

BEGIN { FS="\\\\\\\\"" }

{
for(i = 1; i <= NF; i++) {
if (i%2) {
gsub(/[aiueo]/, "", $(i));
printf "%s",$(i);
} else {
printf "\\\\\\\\"%s\\\\\\\\"",$(i);
}
}

print "";
}

... z. B. unter dem Namen "foo.awk" abspeichern, mit "chmod +x foo.awk" ausführbar machen und wie folgt aufrufen:

./foo.awk <data.txt

Dann bekommst du diese Ausgabe:

ns zw "drei" vr "fuenf sechs"
sbn "acht neun" zhn

Ich denke, das dürfte ziemlich nahe an dem dran sein, was dir vorschwebte, allerdings bitte in Zukunft bei solchen Fragen immer exakt das genaue Dateiformat angeben, dass man nicht raten muss, und die Antwort evtl. kürzer ausfallen kann. :)

Naja, viel Spaß damit, und danke für die nette Knobelei!

Schönen Tag noch! :)

Antwort bewerten Vielen Dank für Deine Bewertung

Hallo

Linux sed - Buchstabe ersetzen, aber nicht innerhalb von Anführungszeichen?

Ohne die Zeilen beim "Hallo" umzubrechen geht das mit sed nicht, denn sed arbeitet nur Zeilenweise.

Aber bestimmt könnte man da mit awk oder perl was machen.

Linuxhase

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Linuxhase
02.07.2017, 22:42

Nachtrag:

So geht das mit Auftrennung der Zeilen:

echo 'hallo "hallo"'|sed 's/"/\n/'|sed '/"/!s/a//g'
hllo
Hallo"

Dann brauchst Du nur noch die Gänsefüßchen entfernen oder setzen; je nachdem was Du am Ende brauchst.

sed '/Hallo"/"Hallo"/g'

Linuxhase

1

Das wirst Du mit sed nicht vernünftig hinbekommen. Der Link zu dem Stackoverflow-Posting, wo einfach nur Leerzeichen innerhalb von Anführungszeichen entfernt werden sollten, beschreibt da im Zweifel noch das einfachere Problem.

Meines Erachtens bist Du wirklich mit einem kleinen C-Programm am besten bedient. Wenn man bei der Eingabe Annahmen machen kann wie z. B. eine maximale Zeilenlänge, dann lässt sich sowas (stdin nach stdout) auch sehr schnell implementieren. Einfach per fgets() zeilenweise einlesen, dann über den String gehen, bei gefundenen Quotes ein Quoteflag setzen, und wenn ab Laufpointer Stringvergleich zutrifft, Wort halt ersetzen (oder auch nicht, je nach Quoteflag).

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?