【问题标题】:Replace a statement in java file using shell script使用 shell 脚本替换 java 文件中的语句
【发布时间】:2013-03-12 04:43:00
【问题描述】:

我需要使用 shell 脚本替换变量赋值语句。例如:MyConstants.java 文件包含像

这样的行
 String abcd = "ABCD"; 
 String abc = "ABC";
 String e = abcd + "e";

我需要将变量 abcd 替换为

 String abcd = "newString"; 
 String abc = "ABC";
 String e = abcd + "e";

问题是它以随机方式包含 \n \r 字符

  String abcd = 
 "ABCD"; 
 or 
 String abcd 
 = 

 "ABCD";
 String abc = "ABC";
 String e = abcd + "e";

我看过How to replace catch block in *.java using sed? 但是所有命令都基于单行模式。 (将输入作为单行) 我该如何解决这个问题?请帮忙。

【问题讨论】:

  • 我假设您需要替换变量的值并给出变量的名称,不是吗?
  • @Alepac:是的,我需要替换变量的值
  • 你需要这个来修补旧的 BAD 源代码还是需要一种 java 预处理器?
  • @Alepac:实际上我们有一个共同的项目源。我们需要更新一个包含基本 url 变量的 java 文件,并为同一项目源生成不同的构建。
  • 您可以使用属性或资源来加载可变内容,这些内容可以根据配置进行更改,而不是将某些 url 硬编码到代码中并在编译阶段进行更改

标签: string bash shell string-comparison


【解决方案1】:

为什么不将“ABCD”替换为“newString”? 喜欢

sed 's/\"ABCD\"/\"newString\"/'

或者/n/r符号可以在“ABCD”中间找到? 或者,另一种方法是首先删除放置在“;”附近的/n/r/

【讨论】:

  • 我不能这样做,因为我只知道变量名而不知道值。
【解决方案2】:

这里是源文件:

$ cat test
String abcd =
"ABCD";
String abcd
=
"ABCD";
String abc = "ABC";
String e = abcd + "e";

这就是,我们如何从错误的地方替换所有 \n\r 并更改变量值:

cat test | tr '\n' ' ' | sed 's/abcd = \"[a-zA-Z0-9_]*\"/abcd = \"newString\"/g' | tr ';' '\n'
String abcd = "newString"
 String abcd = "newString"
 String abc = "ABC"
 String e = abcd + "e"

【讨论】:

    【解决方案3】:

    看看这是否适合您作为起点。

    sed -ne "H;/;/bsubst;\$bsubst;b;:subst;s/.*//;x;s/^\n//;/String\s*abcd/s/\".*\"/\"newstring\"/;p" testfile
    

    它的作用是:每一行都被添加到保持空间 (H),然后如果它包含一个 ;或者是最后一行,则跳转到:subst标签,否则跳转到末尾并进入下一行。

    在 :subst 我们清除当前行并将其与保持空间交换(这将获取累积的数据并为下一批清除保持空间)。然后我们删除一个换行符,因为此时似乎有一个额外的(不知道为什么)。之后,如果行包含正确的变量名称,它会替换变量的值并打印我们拥有的任何内容。我不会说它是万无一失的,但它适用于测试数据。

    【讨论】:

    • 我收到以下错误。你能帮忙sed: 2: "H;/;/bsubst;$bsubst;b;: ...": undefined label 'subst;$bsubst;b;:subst;s/.*//;x;s/^\n//;/String\s*abcd/s/".*"/"newstring"/;p'
    • 在我对 rhel 6 和 Cygwin 的测试中运行良好,您使用的是什么操作系统?
    • 您可以尝试添加一些空格 - 我的 sed 版本不在乎,但是.../;/b subst; \$b subst; b; :subst; 或者,单独拆分标签:"H;/;/bsubst;\$bsubst;b" -e ":subst" -e "s/.*/...
    • 试过 sed -ne "H;/;/bsubst;\$bsubst;b" -e ":subst" -e "s/.*//;x;s/^\n//;/String\s*abcd/s/\".*\"/\"newstring\"/;p" test.txt ... 出现错误 sed: 2: "s/.*//;x;s/^\n//;/Strin ...": undefined label 'subst;$bsubst;b' 我在 MAC OS 10.8.2 中工作。我应该使用任何特定的外壳。我尝试使用默认 shell 和 bash。
    • 外壳不会有任何区别,显然 Mac OS sed 是“不同的”。这可能会对您有所帮助:Sed undefined label on macos 请注意,我们已经尝试将标签放入它自己的 -e 参数中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多