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

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

ドキュメントやたくさんの投稿を読み続けています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何百もの異なる可能性があるので、ハードコードすることはできません。何を変更する必要があるかについて混乱があるようですので、より明確に説明しようとします。

Java ファイルにはという列挙体がありますTRANF_FIELD。その列挙体に使用できる値は、 が後に続く 2,000 個の値のいずれかです.toInt()。 を削除する必要があります.toInt()。関数名はすべて無関係です。

以下は、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

皆さんの助けに感謝します。ある回答の -i を、すべての Java ファイルへのパスを含めて G-man の提案に追加したところ、うまくいきました。皆さんがロング アイランドにいらっしゃったら、ビールをおごりますよ。おかげでかなり時間が節約できました。

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

答え3

OS によっては、インライン ( -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' 

関連情報