文字列の一部を削除する方法

文字列の一部を削除する方法

私はドキュメントとたくさんの投稿を読んでいますsedが、これを見つけることができないようです。私はたくさんのJavaファイルを持っています。これらのファイルでは、toInt()列挙型を整数に変換するメソッドを使用するメソッドが呼び出されます。すべてのファイルに移動し、.toInt()特定の列挙を削除したいです。

それが私が望むものです。元のコード文字列:

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

私は次のように終わりたいです:

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

ENUM_VALUE何百もの可能性があるため、ハードコードすることはできません。何を変えるべきか混乱した部分があるようで、もっと明確に説明するようにします。

TRANF_FIELD私のJavaファイルには列挙型という名前があります。この列挙に使用できる値は 2,000 個の値のいずれかです.toInt().toInt()無関係な.function名を削除する必要があります。

以下は、Javaコード全体に散在するコード構成の例とそれを処理する方法です。

TRANF_FIELD.TRANF_VALUE_1.toInt()
.toInt()削除してTRANF_FIELD.TRANF_VALUE_1残りはそのままにしたいと思います。ではないので、削除して変更を残したく
TRANF_FIELD.TRANF_KILL_ME.toInt()
                ありません。ないので変わることはありません。.toInt()TRANF_FIELD.TRANF_KILL_ME
TRANG_FIELD.TRANG_VALUE_1.toInt()
TRANF_FIELD
TRANF_FIELD.TRANF_VALUE_1.length()
.toInt()

答え1

次の項目をすべて変更したいようです。

TRANF_FIELD.some_enum_value.toInt()

到着

TRANF_FIELD.that_enum_value

また、他の列挙型(例:)TRANG_FIELD.TRANG_VALUE.toInt()や他のメソッド(例TRANF_FIELD.TRANF_VALUE.length():)も保持します。これは簡単に見える:

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

どこ

  • [A-Za-z0-9_]*任意数の英数字(下線付き)です。これは有効な列挙値と一致させるためのものです。実際には、空の文字列または数字で始まる文字列と一致するので、[A-Za-z_][A-Za-z0-9_]*より良いです。[A-Za-z0-9_]*
  • \(...\)列挙名(TRANF_FIELD)、リテラルピリオド(\.)、および列挙値(最初の箇条書きから)をグループ化します。
  • \1これは、「見つかった文字列全体を最初のグループに置き換える」、つまりその.toInt()部分を破棄することを意味します。
  • 1行に複数の項目を処理するには、g最後のスラッシュの後に(global)を追加します。
  • これは埋め込みスペースを処理しません(たとえばTRANF_FIELD . TRANF_VALUE、この問題を解決することは練習のままです)。
  • たとえば、次のように複数行にわたる式は処理されません。

        i = TRANF_FIELD
                 .TRANF_VALUE.toInt();
    

    これは修正するのがより困難です。

答え2

みんなの助けに感謝します。すべてのJavaファイルへのパスを含め、G-manが提案した答えに-iを追加しましたが、うまくいきました。ロングアイランドに来たらビール買ってあげよう。これにより時間が大幅に節約されます。

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

答え3

オペレーティングシステムによっては、inline(-i)はsed次のことができます。

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

単に ".toInt()" のインスタンスを "" に置き換えるだけです。.これはエスケープされ、ワイルドカードとして機能しません。

複数のファイルを参照している場合は、現在のディレクトリとサブディレクトリにあるすべてのファイルを検索してこのコマンドを繰り返す必要があります。

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

ただし、ファイル名にスペースが含まれているとエラーが発生するため、xargsすべてのファイル名の周りに引用符を追加するコマンドでこの問題を処理できます。

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

ただし、これはコンパイルされたファイルも選択するので、これを防ぐために便利な関数を使用して上書きperlできます。

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

答え4

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

関連情報