如何删除字符串的一部分

如何删除字符串的一部分

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

相关内容