我一直在閱讀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'