我一直在阅读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'