2015-02-17 3 views
1

У меня есть файл ethernet, содержащий несколько строк. Я сохранил одну из этих строк как переменную под названием old_line. Содержимое этой переменной выглядит следующим образом:Sed: заменить строковую переменную переменной строки

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="2r:11:89:89:9g:ah", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1" 

Я создал вторую переменную NEW_LINE, который похож на old_line, но с некоторыми изменениями в тексте.

Я хочу, чтобы заменить содержимое old_line с содержанием NEW_LINE с использованием СЭД. До сих пор у меня есть следующий, но он не работает:

sed -i "s/${old_line}/${new_line}/g" ethernet 
+0

Попробуйте без {} вокруг переменных? Также проверьте http://stackoverflow.com/questions/8938571/find-and-replace-variables-containing-non-escaped-characters-with-sed – trainoasis

+0

Спасибо, но, к сожалению, это тоже не сработает. – user2835098

ответ

1

Вам нужно бежать ваш oldline так, что он не содержит никаких специальных символов регулярных выражений, к счастью, это можно сделать с помощью СЭД.

old_line=$(echo "${old_line}" | sed -e 's/[]$.*[\^]/\\&/g') 
sed -i -e "s/${old_line}/${new_line}/g" ethernet 
+0

Да, это абсолютно трюк! Я очень благодарен PatJ !! – user2835098

+0

Для более общего случая «/» также следует избегать, пока «\» и «&» в переменной new_line. – PatJ

5

С ${old_line} содержит много регулярных выражений специальных метасимволов как *, ? и т.д. поэтому ваш sed не удается.

Используйте эту команду awk вместо этого использует не регулярное выражение:

awk -v old="$old_line" -v new="$new_line" 'p=index($0, old) { 
     print substr($0, 1, p-1) new substr($0, p+length(old)) }' ethernet 
+0

Спасибо, я скопировал скрипт, но он только перекликается с содержимым переменной новой переменной в моем терминале. Он не изменяет файл ** ethernet **. Что я делаю не так? – user2835098

+1

Это не «неправильно» само по себе, это просто, что простой jane Awk не поддерживает встроенное редактирование. Если у вас есть Gawk, попробуйте добавить опцию '--inline'. Если нет, сохраните файл temp и переместите его поверх оригинала. – tripleee

+0

Хорошо, если я использую gawk, как должна выглядеть команда? Если gawk не работает, мне нужно заменить старую строку, есть ли способ удалить строку? – user2835098

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