2015-05-07 4 views
0

Я хочу, чтобы заменить следующую строку:скрипт, чтобы заменить строку с некоторыми специальными символами в Linux

@OneToMany(fetch = FetchType.LAZY, mappedBy = "patient") 

с этой линией:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "patient", cascade = CascadeType.ALL) 

Я предпочитаю использовать sed, но я не могу это сделать работать на меня из-за этих специальных символов. Любое тело может мне помочь?

+0

Если добавить [код, который вы пробовали до сих пор] (http://stackoverflow.com/help/mcve) вы помочь людям ответить на ваш вопрос. – kalyfe

+0

См. Http://stackoverflow.com/questions/29613304/is-it-possible-to-escape-regex-metacharacters-reliably-with-sed/29626460#29626460 –

ответ

1

Если это просто, что одна линия, можно сказать, что

sed 's/)$/, cascade = CascadeType.All)/' 

, cascade = CascadeType.All) вставить до закрытия регулярных выражений ($ соответствует концу строки здесь).

Я подозреваю, что у вас есть файл, в котором больше строк, которые должны оставаться неизменными, и что вы хотите, чтобы замена выполнялась только в этой строке. В этом случае вам понадобится некоторый критерий, который однозначно идентифицирует строку - чаще всего регулярное выражение. Если, например, это единственная линия, которая начинается с @OneToMany(, вы могли бы использовать

sed '/^@OneToMany(/ s/)$/, cascade = CascadeType.All)/' 

Это будет инструктировать sed пытаться замену только если текущая строка соответствует регулярному выражению ^@OneToMany(. Если есть другие строки, которые начинаются таким образом и должны оставаться нетронутыми, найдите регулярное выражение, которое однозначно идентифицирует строку и использует ее вместо этого.

0

Вот awk версия:

awk '/@OneToMany/ {sub(/\)/,", cascade = CascadeType.ALL&")}1' file 
@OneToMany(fetch = FetchType.LAZY, mappedBy = "patient", cascade = CascadeType.ALL) 
Смежные вопросы