0

I need to replace a variable assignment statement using shell script. Eg: MyConstants.java file contains lines like

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

I need to replace variable abcd as

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

The problem is it contains \n \r characters in random manner like

  String abcd = 
 "ABCD"; 
 or 
 String abcd 
 = 

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

I had a look at How to replace catch block in *.java using sed? But all commands are based on a single line pattern. (Takes input as a single line) How do I sort out this? Please help.

4

3 回答 3

0

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

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

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

于 2013-03-22T11:01:45.673 回答
0

这是源文件:

$ 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"
于 2013-03-22T12:24:34.773 回答
0

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

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

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

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

于 2013-03-22T14:46:57.810 回答