Ich versuche, Zeilen in einer Textdatei zu duplizieren, die bestimmte Sonderzeichen enthalten, aber im Duplikat die Sonderzeichen durch „normale“ ASCII-Zeichen zu ersetzen. Der konkrete Anwendungsfall sind akzentuierte Zeichen.
Eingang:
éva
test
frédéric
Gewünschte Ausgabe:
éva
eva
test
frédéric
frederic
Im Moment kann ich die Zeilen duplizieren, die das é
Zeichen enthalten, aber ich bin nicht sicher, wie ich in der Erfassungsgruppe suchen und ersetzen kann.
Folgendes habe ich bisher:
echo 'éva\ntest\nfrédéric' | sed 's/\(.*é.*\)/&\n\1/'
Kann ich das mit machen sed
? Wenn nicht, arbeite ich gern mit awk
...
Antwort1
Sie können mehrere Befehle abgleichen é
und dann anwenden:
sed '/é/{p;s/é/e/g;}'
Für jede Zeile, die enthält é
, wird der aktuelle Musterbereich gedruckt, dann werden alle é
s durch ersetzt e
(und der Musterbereich erneut gedruckt).
Das AWK-Äquivalent ist
awk '/é/{print; gsub(/é/, "e")}1'
sed
Der s
Befehl kann das Adressmuster wiederverwenden:
sed '/é/{p;s//e/g;}'
und wenn Ihre Ersetzungen alle Einzelzeichen-Ersetzungen sind, y
ist der Befehl effizienter:
sed '/é/{p;y/é/e/;}'
Antwort2
$ awk '1; gsub(/é/,"e")' file
éva
eva
test
frédéric
frederic
Die oben genannten Verwendungen:
- Die idiomatische wahre Bedingung,
1
die awk dazu veranlasst, die Standardaktion des Druckens der aktuellen Zeile auszuführen. Anschließend gilt: gsub()
um alleé
s durche
s zu ersetzen, und wenn dadurch alle s gefunden/ersetzt wurden,é
dann bewirkt seine positive Rückgabe, die im Bedingungskontext verwendet wird, erneut, dass awk die Standardaktion des Druckens der aktuellen (jetzt geänderten) Zeile ausführt.
Beachten Sie, dass wir durch die Verwendung des Rückgabecodes, der gsub()
uns mitteilt, ob é
s gefunden wurden, nicht denselben regulären Ausdruck /é/
doppelt im Befehl angeben müssen.
Antwort3
Eine weitere sed
Option - inspiriert von@EdMortons awk
Antwort
sed -n 'p;s/é/e/gp' file
Antwort4
Andere Option,ähnlich wie @Stephen Kitt:
$ sed '/é/p;s/é/e/g'
éva
eva
test
frédéric
frederic
/é/p
Wählen Sie die Zeilen aus, die einé
Zeichen enthalten, und drucken Sie sie.s/é/e/g
Drucken Sie die vorherigen Zeilen mit der Ersetzung.