So entfernen Sie einen Teil einer Zeichenfolge

So entfernen Sie einen Teil einer Zeichenfolge

Ich lese ständig die sedDokumentation und viele Beiträge, aber ich komme einfach nicht dahinter. Ich habe eine große Anzahl von Java-Dateien. In diesen Dateien befinden sich Aufrufe einer Methode, die die Enumeration mithilfe der Methode in eine Ganzzahl konvertiert . Ich möchte alle Dateien durchgehen und eine bestimmte Enumeration toInt()löschen ..toInt()

Das ist, was ich will. Die ursprünglichen Codezeichenfolgen:

foo(ENUM_NAME.ENUM_VALUE.toInt(), arg2, arg3)
foo(ENUM_NAME.ENUM_VALUE2.toInt(), arg2, arg3)

Ich möchte mit Folgendem enden:

foo(ENUM_NAME.ENUM_VALUE, arg2, arg3)
foo(ENUM_NAME.ENUM_VALUE2, arg2, arg3)

ENUM_VALUEEs könnte Hunderte verschiedener Möglichkeiten geben, daher kann ich nicht hart codieren. Es scheint, dass eine gewisse Verwirrung darüber herrscht, was geändert werden muss, daher werde ich versuchen, es klarer auszudrücken.

In meinen Java-Dateien wird eine Aufzählung aufgerufen TRANF_FIELD. Die für diese Aufzählung verfügbaren Werte könnten einer von zweitausend Werten sein, gefolgt von .toInt(). Ich muss das loswerden .toInt(). Die Funktionsnamen sind alle irrelevant.

Nachfolgend finden Sie Beispiele für Codekonstrukte, die in meinem Java-Code verstreut sind, und wie sie verarbeitet werden sollten:

TRANF_FIELD.TRANF_VALUE_1.toInt()
                Ich möchte das .toInt()gelöscht und TRANF_FIELD.TRANF_VALUE_1übrig gelassen haben.
TRANF_FIELD.TRANF_KILL_ME.toInt()
                Ich möchte das .toInt()gelöscht und übrig gelassen haben . TRANF_FIELD.TRANF_KILL_ME
TRANG_FIELD.TRANG_VALUE_1.toInt()
                Keine Änderung, weil es nicht ist TRANF_FIELD.
TRANF_FIELD.TRANF_VALUE_1.length()
                Keine Änderung, weil es nicht ist .toInt().

Antwort1

Sie scheinen alle Vorkommen von ändern zu wollen

TRANF_FIELD.some_enum_value.toInt()

Zu

TRANF_FIELD.that_enum_value

während andere Aufzählungen (z. B. TRANG_FIELD.TRANG_VALUE.toInt()) und andere Methoden (z. B. TRANF_FIELD.TRANF_VALUE.length()) unverändert bleiben. Das scheint einfach:

sed 's/\(TRANF_FIELD\.[A-Za-z0-9_]*\)\.toInt()/\1/'

Wo

  • [A-Za-z0-9_]*ist eine beliebige Anzahl alphanumerischer Zeichen (einschließlich Unterstriche). Dies soll jedem gültigen Aufzählungswert entsprechen. Eigentlich [A-Za-z_][A-Za-z0-9_]*wäre es besser, da es mit [A-Za-z0-9_]*einer leeren Zeichenfolge oder einer Zeichenfolge übereinstimmen könnte, die mit einer Ziffer beginnt.
  • \(\)gruppiert den Aufzählungsnamen ( TRANF_FIELD), den Literalpunkt ( \.) und den Aufzählungswert (aus dem ersten Aufzählungspunkt).
  • \1bedeutet „ersetze den kompletten gefundenen String durch die erste Gruppe“, also verwerfe den .toInt()Teil.
  • Um mehrere Vorkommen pro Zeile zu verarbeiten, fügen Sie gnach dem letzten Schrägstrich (global) hinzu.
  • Eingebettete Leerzeichen, z. B. , werden hier nicht verarbeitet TRANF_FIELD . TRANF_VALUE. Das Beheben dieses Problems bleibt eine Übung.
  • Dies wird nicht mit Ausdrücken umgehen, die über mehrere Zeilen verteilt sind, z. B.

        i = TRANF_FIELD
                 .TRANF_VALUE.toInt();
    

    Das ist schwieriger zu beheben.

Antwort2

Vielen Dank für all eure Hilfe, Leute. Ich habe das -i aus einer Antwort, einschließlich des Pfads zu allen Java-Dateien, zu dem hinzugefügt, was G-man vorgeschlagen hat, und es funktioniert. Wenn ihr mal auf Long Island seid, gebe ich euch ein Bier aus. Das hat mir eine Menge Zeit gespart.

sed -i 's/\(TRANF_FIELD\.[A-Za-z0-9_]*\)\.toInt()/\1/g' 

Antwort3

Abhängig von Ihrem Betriebssystem könnte ein Inline ( -i) sedFolgendes tun:

sed -i 's:\.toInt()::' filename

Dabei wird einfach die Instanz von „.toInt()“ durch „“ ersetzt – das .wird maskiert, sodass es nicht als Platzhalter fungiert.

Da Sie mehrere Dateien erwähnen, müssen Sie diesen Befehl wiederholen, indem Sie nach allen Dateien im aktuellen Verzeichnis und den Unterverzeichnissen suchen:

find . -type f -exec sed -i 's:\.toInt()::' {} \;

Wenn die Dateinamen jedoch Leerzeichen enthalten, wird ein Fehler ausgegeben. Daher können wir dieses Problem xargsmit dem folgenden Befehl beheben, der alle Dateinamen in Anführungszeichen setzt:

find . -type f | xargs -I{} sed -i 's:\.toInt()::' "{}"

Allerdings werden dabei auch kompilierte Dateien ausgewählt. Um diese zu vermeiden, können wir eine nützliche Funktion verwenden, um perlsie zu ignorieren:

find . -type f | perl -nle 'print if -T' | xargs -I{} sed -i 's:\.toInt()::' "{}"

Antwort4

sed 's/ENUM_NAME\.\(.*\)\.toInt()/ENUM_NAME.\1/g' 

verwandte Informationen