2013-03-22 4 views
0

Мне нужно заменить оператор присваивания переменных с помощью сценария оболочки. Например: MyConstants.java файл содержит строки, какЗаменить оператор в java-файле с помощью сценария оболочки

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

Мне нужно заменить переменную абвг в

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

Проблема в том, что содержит \ п \ R символов в случайном порядке, как

String abcd = 
"ABCD"; 
or 
String abcd 
= 

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

Я посмотрел на How to replace catch block in *.java using sed? Но все команды основаны на шаблоне с одной строкой. (Принимает ввод в виде одной строки) Как это сделать? Пожалуйста помоги.

+0

Я предполагаю, что вам нужно заменить значение переменной, указав имя переменной, не так ли? – Alepac

+0

@Alepac: Да Мне нужно заменить значение переменной – LincyTonita

+0

Вам нужно это, чтобы исправить старый исходный код BAD или вам нужен какой-то препроцессор java? – Alepac

ответ

0

Почему вы не заменяете просто «ABCD» на «newString»? как

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

или/п г/символов можно найти в середине «ABCD»? Или, иначе вы должны сначала удалить/n/r /, которые расположены не рядом с ";"

+0

Я не могу этого сделать, потому что знаю только имя переменной, а не значение. – LincyTonita

0

Вот исходный файл:

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

И это, как мы можем заменить все \ п \ г от неправильных местах и ​​изменить значение переменной:

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" 
0

Смотрите, если это будет работать для вы в качестве отправной точки.

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

Вот что он делает: Каждая строка добавляется в трюма (H), а затем, если он либо содержит; или последняя строка, она перескакивает на метку: subst, иначе она перескакивает до конца и переходит к следующей строке.

На: subst мы очищаем текущую строку и свопим ее с удержанием (это дает нам накопленные данные и очищает пространство удержания для следующей партии). Затем мы удаляем символ новой строки, потому что на данный момент, кажется, есть лишний (не знаете почему). После этого он заменяет значение переменной, если строка (строки) содержит правильное имя переменной и печатает все, что у нас есть. Я бы не сказал, что он надежный, но он работает против тестовых данных.

+0

Я получаю следующую ошибку. может u помочь 'sed: 2:" H; /;/bsubst; $ bsubst; b ;: ... ": undefined label 'subst; $ bsubst; b;: subst; s /.*//; x; s/^ \ n //;/String \ s * abcd/s /".*"/ "newstring" /; p'' – LincyTonita

+0

Хорошо работает в моих тестах на rhel 6 и Cygwin, какую ОС вы используете? – William

+0

Вы можете попробовать добавить несколько пробелов - мои версии sed не волнуют, но ... '/;/b subst; \ $ b subst; б; : subst; 'В качестве альтернативы, разделите метку самостоятельно:' "H; /;/bsubst; \ $ bsubst; b" -e ": subst" -e "s /. */...' – William

Смежные вопросы