Хочу добавить строку в файл на linux - PullRequest
0 голосов
/ 07 марта 2020

У меня есть сервер linux centos 7, и я хочу, чтобы ниже строки в файл с именем config. xml

<vhostMap>
  <vhost>google</vhost>
  <domain>google.com, www.google.com</domain>
</vhostMap>

Я хочу добавить эти строки после строки 8 в файле конфигурации. xml file

как это возможно с помощью команды sed или awk? это python или perl? Я много искал, но мне трудно, как я, нуб, может кто-нибудь сказать мне пример?

Спасибо.

Ответы [ 3 ]

1 голос
/ 08 марта 2020

Самый простой способ сделать это с помощью команд оболочки - показать заголовок 8 строк оригинальной конфигурации. xml и отклонить вывод в новый файл. Затем добавьте новый файл с вашим кодом и, наконец, включите хвост конфигурации. xml начиная со строки 8

$ head -n 8 config.xml > newconfig.xml
$ cat your_code.txt >> newconfig.xml
$ tail -n+8 config.xml >> newconfig.xml

Наконец, вы можете заменить исходную конфигурацию. xml новым файлом. Проверьте содержимое конфига. xml перед этим!

$ mv newconfig.xml config.xml
1 голос
/ 08 марта 2020

В perl такая операция может быть легко осуществлена ​​множеством способов, не стесняйтесь выбирать ту, которая вам подходит

Заменяющий подход

use strict;
use warnings;
use feature 'say';

my $filename = 'config.xml';

my $insert = 
'<vhostMap>
  <vhost>google</vhost>
  <domain>google.com, www.google.com</domain>
</vhostMap>';

open my $fh, '<', $filename
    or die "Couldn't open $filename: $!";

my $data = do{ local $/; <$fh> };

close $fh;

$data =~ s/((.*?\n){8})/${1}$insert\n/s;

open $fh, '>', $filename
    or die "Couldn't open $filename: $!";

say $fh $data;

close $fh;

Подход среза массива

use strict;
use warnings;
use feature 'say';

my $filename = 'config.xml';

my $insert = '<vhostMap>
  <vhost>google</vhost>
  <domain>google.com, www.google.com</domain>
</vhostMap>';

open my $fh, '<', $filename
    or die "Couldn't open $filename: $!";

my @lines = <$fh>;

close $fh;

open $fh, '>', $filename
    or die "Couldn't open $filename: $!";

say $fh @lines[0..7],$insert,"\n",@lines[8..$#lines];

close $fh;

Итерационный подход к массиву

use strict;
use warnings;
use feature 'say';

my $filename = 'config.xml';

my $insert = '<vhostMap>
  <vhost>google</vhost>
  <domain>google.com, www.google.com</domain>
</vhostMap>';

open my $fh, '<', $filename
    or die "Couldn't open $filename: $!";

my @lines = <$fh>;

close $fh;

open $fh, '>', $filename
    or die "Couldn't open $filename: $!";

my $line_count = 0;

for (@lines) {
    chomp;
    $line_count++;      
    say $fh $_; 
    say $fh $insert if $line_count == 8;
}

close $fh;

Вход

line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
line 9
line 10
line 11
line 12

Выход

line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
<vhostMap>
  <vhost>google</vhost>
  <domain>google.com, www.google.com</domain>
</vhostMap>
line 9
line 10
line 11
line 12
1 голос
/ 07 марта 2020

В Python легко:

to_add = """<vhostMap>
  <vhost>google</vhost>
  <domain>google.com, www.google.com</domain>
</vhostMap>
"""
with open("config.xml", "r") as f:
    all_lines = f.readlines()
with open("config.xml", "w") as f:
    for l in all_lines[:8]: f.write(l)
    f.write(to_add)
    for l in all_lines[8:]: f.write(l)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...