GNU/Linux >> LINUX-Kenntnisse >  >> Linux

ersetzen Sie Text mit gleicher Länge mit sed

Mein Verdacht ist, dass Sie es im Standard sed nicht tun können , aber Sie könnten es mit Perl oder etwas anderem mit leistungsfähigerer Regex-Behandlung tun.

$ echo "She sells sea shells by the sea shore" |
> perl -pe 's/(sh[a-z]*)/"." x length($1)/gei'
... sells sea ...... by the sea .....
$

Die e Modifikator bedeutet, dass das Ersetzungsmuster ein ausführbares Perl-Skript ist; in diesem Fall wiederholt es das Zeichen . so oft, wie es Zeichen im übereinstimmenden Muster gibt. Die g Modifikator wiederholt sich über die Zeile; die i Modifikator ist für den Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung. Die -p Option zu Perl gibt jede Zeile nach der Verarbeitung in dem Skript aus, das durch den -e angegeben ist Option — der Ersatzbefehl.


Erledigt dieser awk-oneliner die Arbeit für Sie?

awk '{for(i=1;i<=NF;i++)if($i~/^[Ss]h/)gsub(/./,".",$i)}1' file

Test mit Ihren Daten:

kent$  echo "She sells sea shells by the sea shore"|awk '{for(i=1;i<=NF;i++)if($i~/^[Ss]h/)gsub(/./,".",$i)}1'
... sells sea ...... by the sea .....

Eine alte Frage, aber ich habe eine nette und relativ kurze einzeilige Lösung gefunden:

sed ':a;s/\([Ss]h\.*\)[^\. ]/\1./;ta;s/[Ss]h/../g'

Funktioniert durch Ersetzen eines Zeichens nach dem anderen in einer Schleife.

:a; eine Schleife starten

s/\([Ss]h\.*\)[^\. ] Suche nach sh gefolgt von einer beliebigen Zahl von . s (unsere bisher abgeschlossene Arbeit) gefolgt von einem Nicht-Punkt- oder Leerzeichen (was wir ersetzen werden)

/\1./; Ersetzen Sie es durch unsere bisher abgeschlossene Arbeit plus ein weiteres . .

ta; wenn wir eine Ersetzung vorgenommen haben, Schleife, sonst...

s/[Ss]h/../g ersetzen Sie den sh s mit zwei . s und nennen Sie es einen Tag.


Linux
  1. Bearbeiten von Text auf der Kommandozeile mit sed

  2. Verwenden von sed zum Suchen und Ersetzen von Textdateien in Linux

  3. Verwenden Sie Notify-Send mit Cron?

  4. Sed mit Sonderzeichen verwenden?

  5. Mehrere Dateitexte durch Sed ersetzen?

Bearbeiten von Text mit sed und grep

Mit sed einen Textblock entfernen

Verwenden von sed zum Teilen einer Zeichenfolge mit einem Trennzeichen

Suchen und ersetzen Sie Text in einer Datei zwischen einem Zeilenbereich mit sed

Wie füge ich mit sed Text in die erste Zeile einer Datei ein?

ersetzt das n-te Vorkommen von String in jeder Zeile einer Textdatei