Bash, Perl или Sed, вставить на новую строку после найденной фразы - PullRequest
3 голосов
/ 20 июля 2011

Хорошо, я думаю, мне нужно что-то, что будет делать следующее:

поиск этой строки кода в /var/lib/asterisk/bin/retrieve_conf:

$engineinfo = engine_getinfo();

вставьте эти две строки сразу после:*

$engineinfo['engine']="asterisk";
$engineinfo['version']="1.6.2.11";

Заранее спасибо, Джо

Ответы [ 6 ]

7 голосов
/ 20 июля 2011

Вы могли бы сделать это так

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:

a\
line of text\
another line
;

Обратите внимание, что буквенные символы новой строки являются частью этого синтаксиса. Чтобы сделать все это одной строкой (и сохранить возможность копирования-вставки) вместо буквальных строк новой строки, я использовал $'\n', которая скажет bash или zsh вставить настоящую новую строку на месте. Цитирование, необходимое для того, чтобы сделать эту работу, немного сложнее: вы должны выйти из одинарных кавычек, чтобы вы могли интерпретировать $'\n' с помощью bash, а затем вам необходимо повторно ввести строку с одинарными кавычками, чтобы bash не интерпретировал остальная часть вашего ввода.

РЕДАКТИРОВАТЬ: Обновлено, чтобы добавить обе строки в одну команду добавления.

1 голос
/ 20 июля 2011

Однострочный Perl:

perl -pE 's|(\$engineinfo) = engine_getinfo\(\);.*\K|\n${1}['\''engine'\'']="asterisk";\n${1}['\''version'\'']="1.6.2.11";|' file
1 голос
/ 20 июля 2011

Вы также можете использовать 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
1 голос
/ 20 июля 2011

Только ради симметрии вот ответ с использованием awk.

awk '{ if(/\$engineinfo = engine_getinfo\(\);/) print $0"\n$engineinfo['\''engine'\'']=\"asterisk\";\n$engineinfo['\''version'\'']=\"1.6.2.11\"" ; else  print $0 }' in.txt
1 голос
/ 20 июля 2011

Вы можете использовать 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;
    }   
}
0 голосов
/ 20 июля 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...