Bash, Perl или Sed, вставить в новую строку после найденной фразы
Хорошо, я думаю, мне нужно что-то, что будет делать следующее:
Найдите эту строку кода в /var/lib/asterisk/bin/retrieve_conf:
$engineinfo = engine_getinfo();
Вставить следующие две строки:
$engineinfo['engine']="asterisk";
$engineinfo['version']="1.6.2.11";
Заранее спасибо,
Джо
6 ответов:
Вы могли бы сделать это так
sed -ne '/$engineinfo = engine_getinfo();/a\'$'\n''$engineinfo['engine']="asterisk";\'$'\n''$engineinfo['version']="1.6.2.11";'$'\n'';p' /var/lib/asterisk/bin/retrieve_confДобавьте
Что он делает и как он работает?-iдля изменения на месте, как только вы подтвердите, что это работает.Сначала мы говорим sed, чтобы он соответствовал строке, содержащей вашу строку. На этой совпадающей строке мы затем выполним команду
a, которая называется "добавить текст".Синтаксис команды sed
aравенОбратите внимание, что литеральные новые строки являются частью этого синтаксиса. Чтобы сделать все это одной строкой (и сохранить copy-paste способность) вместо буквальных новых строк я использовалa\ line of text\ another line ;$'\n', который скажет bash или zsh вставить реальную новую строку на место. Кавычки, необходимые для выполнения этой работы, немного сложны: вам нужно выйти из одинарных кавычек, чтобы вы могли интерпретировать$'\n'с помощью bash, затем вам нужно повторно ввести строку с одинарными кавычками, чтобы bash не интерпретировал остальную часть вашего ввода.Редактировать: обновлен, чтобы добавить обе строки в одну команду append.
Вы можете использовать Perl и
Tie::File(включено в дистрибутив Perl):use Tie::File; tie my @array, 'Tie::File', "/var/lib/asterisk/bin/retrieve_conf" or die $!; for (0..$#array) { if ($array[$_] =~ /\$engineinfo = engine_getinfo\(\);/) { splice @array, $_+1, 0, q{$engineinfo['engine']="asterisk"; $engineinfo['version']="1.6.2.11";}; last; } }
Просто ради симметрии вот ответ с использованием awk.
awk '{ if(/\$engineinfo = engine_getinfo\(\);/) print $0"\n$engineinfo['\''engine'\'']=\"asterisk\";\n$engineinfo['\''version'\'']=\"1.6.2.11\"" ; else print $0 }' in.txt
Вы также можете использовать
ed:# cf. http://wiki.bash-hackers.org/howto/edit-ed cat <<-'EOF' | ed -s /var/lib/asterisk/bin/retrieve_conf H /\$engineinfo = engine_getinfo();/a $engineinfo['engine']="asterisk"; $engineinfo['version']="1.6.2.11"; . wq EOF
Однострочный Perl:
perl -pE 's|(\$engineinfo) = engine_getinfo\(\);.*\K|\n${1}['\''engine'\'']="asterisk";\n${1}['\''version'\'']="1.6.2.11";|' file
sed -i 's/$engineinfo = engine_getinfo();/$engineinfo = engine_getinfo();<CTRL V><CNTRL M>$engineinfo['engine']="asterisk"; $engineinfo['version']="1.6.2.11";/' /var/lib/asterisk/bin/retrieve_conf
Comments