2016-01-25 5 views
1

Я хочу заменить следующую исходную строку, заменив строку.Заменить строку с помощью sed в Linux

original_str="#22=SI_UNIT(*,*,#5,'','metre');" 
replace_str="#22=SI_UNIT(*,*,#5,'','millimetre');" 
sed -i "s/$original_str/$replace_str/" ./output/modified.txt 

Я попытался по-разному использовать 'sed'. Однако он не работает. Кто-нибудь есть идеи?

Концепция № 22 относится к другой концепции позже в том же файле. Это причина?

Пожалуйста, обратите внимание, что он работает нормально для следующей строки в том же Баш скрипт:

original_str="#103=CARTESIAN_POINT('P3',0.0,0.0,1.0,#72);" 
replace_str="#103=CARTESIAN_POINT('P2',10.0,10.0,10.0,#72);" 
sed -i "s/$original_str/$replace_str/" ./output/modified.txt 

Концепция # 103 не используется в более поздней концепции в том же файле.

спасибо.

ответ

2

Вам нужно бежать символы, которые имеют особое значение в sed, который в данном случае является *:

original_str='#22=SI_UNIT(\*,\*,#5,'','metre');' 
replace_str='#22=SI_UNIT(*,*,#5,'','millimetre');' 
sed -i "s/$original_str/$replace_str/" ./output/modified.txt 

Это будет работать.

+0

Да, вы правы, но я просто понял, что вы * можете * убежать '#', что мне очень интересно. – hgiesel

+0

Как я уже писал, работает более поздний код (замена). Я хочу заменить первый код. Это «метр» до «миллиметра». Кроме того, я пробовал использовать «\». Это не работает. – jp071

2

* - это метасимвол регулярного выражения, который не соответствует самому себе (или делает это только по совпадению). Вам нужно сбежать от него в original_str.

sed -i "s/${original_str//\*/\\*}/$replace_str/" ./output/modified.txt 

Синтаксис $(variable//substr/repl} Bash-specific. В общем случае вам нужно будет избежать каких-либо специальных предложений регулярных выражений - [, \ и . - что более сложно сделать в общем в Bash.

+0

Спасибо, тройной. Это работает :-) Отличная помощь. – jp071

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