如何刪除字串的一部分

如何刪除字串的一部分

我一直在閱讀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 檔案中有一個名為的枚舉。該枚舉可用的值可以是兩千個值之一,後面跟著.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()部分。
  • 若要處理每行多次出現的情況,請g在最後一個斜線後加上 (global)。
  • 這不會處理嵌入的空白,例如TRANF_FIELD . TRANF_VALUE.解決這個問題留作練習。
  • 這不會處理跨行的表達式;例如,

        i = TRANF_FIELD
                 .TRANF_VALUE.toInt();
    

    這更難修復。

答案2

感謝大家的幫忙。我將一個答案中的 -i 添加到了 G-man 建議的內容中,包括所有 java 檔案的路徑,並且它有效。如果你們來長島,我會買啤酒給你們。這節省了我很多時間。

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

答案3

根據您的作業系統,內聯 ( -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' 

相關內容