Perl + добавить текст между двумя строками в файле - PullRequest
0 голосов
/ 11 августа 2010

Мне нужно отредактировать файл, основная проблема - добавить текст между двумя известными строками в файле

например мне нужно добавить следующий текст

a b c d e f

1 2 3 4 5 6

бла бла

Между первой линией и второй линией

first_line=")"

second_line="NIC Hr_Nic ("

примечание: аргумент first_line и second_line может получить любую строку или строку

Как это сделать с помощью perl? (я пишу скрипт bash и мне нужно вставить синтаксис perl в мой скрипт)

Lidia

Ответы [ 3 ]

0 голосов
/ 11 августа 2010

Вы можете прочитать файл как одну строку, а затем использовать регулярное выражение для поиска и замены:

use strict;
use warnings;

# Slurp file myfile.txt into a single string
open(FILE,"myfile.txt") || die "Can't open file: $!";
undef $/;
my $file = <FILE>;

# Set strings to find and insert
my $first_line = ")";
my $second_line = "NIC Hr_Nic (";
my $insert = "hello world";

# Insert our text
$file =~ s/\Q$first_line\E\n\Q$second_line\E/$first_line\n$insert\n$second_line/;

# Write output to output.txt
open(OUTPUT,">output.txt") || die "Can't open file: $!";
print OUTPUT $file;
close(OUTPUT);

Отключив $/, мы переводим Perl в режим "slurp"" и так легко может прочитать весь файл в $file.

. Мы используем оператор s/// , чтобы выполнить поиск и заменить, используя две наши строки поиска в качестве шаблона..

\Q и \E предписывают Perl избегать строк между ними, то есть игнорировать любые специальные символы, которые находятся в $first_line или $second_line.

Youпри желании всегда может записать вывод поверх исходного файла.

Проблема, как вы утверждаете, не решаема при использовании опции -i командной строки , поскольку эта опция обрабатывает файл одной строкой ввремя;чтобы вставить текст между двумя конкретными строками, вам нужно знать сразу две строки.

0 голосов
/ 11 августа 2010

Я не уверен, правильно ли я понимаю ваш вопрос.Я думаю, что пример содержимого файла «до и после» будет проще.Во всяком случае, вот мое мнение, используя сращивание вместо регулярного выражения.Конечно, мы должны знать номера строк, чтобы это работало.

Загрузить файл в массив:

my @lines;
open F, '<', 'filename' or die $!;
push @lines, $_ for <F>;
close F;

Вставить материал (см. perldoc -f splice):

splice @lines, 1, 0, ('stuff');

.. и все готово.Все, что вам нужно сделать сейчас, это снова сохранить массив:

open F, '>', 'filename' or die $!;
print F @lines;
close F;
0 голосов
/ 11 августа 2010

Ну, чтобы втиснуть струны вы делаете

my $text = $first_line . $second_line;

или

my $text = $first_line;
$text .= $second_line;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...