Как добавить строку в несколько текстовых файлов в разных подкаталогах, только если строка не существует? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть каталог с именем "technology", а в каталоге "technology" у меня есть несколько подкаталогов, вложенных максимум на два уровня.

В каждом подкаталоге у меня есть хотя бы один "* .txt"файл, в котором может быть до 20-30 строк.

Теперь я хочу добавить строку" Замечания "в каждый файл * .txt, охватывающий несколько подкаталогов, только если строка отсутствует. уже.

Я получаю список всех файлов в подкаталоге, используя:

find ./ -name '*.txt'

Я использую нижеприведенный скрипт Perl для обновления записей, с новыми замечаниями, как показано ниже.

/technology$ perl -p -i -e 's/Remarks.*/Remarks: NEW Value/'   'find ./ -name *.txt'

Проблема с приведенным выше сценарием заключается в том, что он обновляет только существующее поле примечаний.

Как я могу добавить запись (одно замечание) для ТОЛЬКО тех файлов, у которых ее еще нет?

Я хочу добавить строку только в те файлы, которые не содержат«Строка замечаний».

1 Ответ

3 голосов
/ 19 октября 2019

Не совсем понятно, хотите ли вы обновить строки, содержащие Remarks в файлах, которые уже содержат такую ​​строку, или вы хотите оставить эти файлы без изменений и добавить только строку в конце того файла, который нене содержит замечаний.

К счастью, особой разницы нет. Этот код должен работать для «редактирования существующих Remarks строк; добавление новой Remarks строки, если ее еще нет»:

#!/usr/bin/env perl -i

use strict;
use warnings;

my $num_remarks = 0;

while (<>)
{
    $num_remarks++ if s/Remarks.*/Remarks: NEW Value $$/;
    print;
}
continue
{
    if (eof)
    {
        print "Remarks: NEW Value $$\n" if $num_remarks == 0;
        $num_remarks = 0;
    }
}

Альтернативное требование «оставить существующие Remarks строки без изменений;добавить новую строку Remarks, если ее нет ", можно обработать с помощью:

#!/usr/bin/env perl -i

use strict;
use warnings;

my $num_remarks = 0;

while (<>)
{
    $num_remarks++ if m/Remarks/;   # m// instead of s///
    print;
}
continue
{
    if (eof)
    {
        print "Remarks: NEW Value $$\n" if $num_remarks == 0;
        $num_remarks = 0;
    }
}

Возможно, есть более короткие способы написания этого кода. Оба варианта включают PID процесса Perl в строку «Замечания» при его добавлении. Это позволяет легче видеть, когда все меняется.

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