Wie kann ich eine Zeile duplizieren und mit sed im Duplikat suchen und es ersetzen?

Wie kann ich eine Zeile duplizieren und mit sed im Duplikat suchen und es ersetzen?

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'

sedDer sBefehl kann das Adressmuster wiederverwenden:

sed '/é/{p;s//e/g;}'

und wenn Ihre Ersetzungen alle Einzelzeichen-Ersetzungen sind, yist der Befehl effizienter:

sed '/é/{p;y/é/e/;}'

Antwort2

$ awk '1; gsub(/é/,"e")' file
éva
eva
test
frédéric
frederic

Die oben genannten Verwendungen:

  1. Die idiomatische wahre Bedingung, 1die awk dazu veranlasst, die Standardaktion des Druckens der aktuellen Zeile auszuführen. Anschließend gilt:
  2. gsub()um alle és durch es 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 sedOption - inspiriert von@EdMortons awkAntwort

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

  • /é/pWählen Sie die Zeilen aus, die ein éZeichen enthalten, und drucken Sie sie.
  • s/é/e/gDrucken Sie die vorherigen Zeilen mit der Ersetzung.

verwandte Informationen