Как поменять местами строки в многострочном

Если документ здесь должен быть добавлен только в том случае, если его нет, вы можете использоватьgrep:

cat <<-"EOF1" > myPath/myFile.append
    content...
EOF1
if ! grep -F -q -f myPath/myFile{.append,}; then
    cat myPath/myFile.append >> myPath/myFile
fi

Чтобы понять это, рассмотрим следующее.

  • grep -F -q -f myPath/myFile{.append,}расширяется оболочкой до grep -F -q -f myPath/myFile.append myPath/myFile.

  • Команда grepищетmyPath/myFile(файл, в который при необходимости следует добавить текст )любую фиксированную строку (-F), содержащуюся вmyPath/myFile.append(файле, содержащем текст для добавления ), чтение один шаблон в строке(-f)и указывает, находит ли он что-либо, только по своему коду выхода без вывода(-q).

  • Затем результат инвертируется !, так что часть thenблока ifвыполняется только в том случае, если grepничего не находит.

0
09.05.2020, 10:47
2 ответа

Самый простой способ использования perl — прочитать все данные сразу, разбить их на строфы, предположительно начинающиеся с 4 цифр в начале строки, а затем работать с каждой строфой отдельно. На основе данных сделаны предположения, поскольку они не полностью указаны в вопросе.

#!/usr/bin/perl
use strict;
my $data = join("", <>);
my @stanzas = split(/^(?=\d{4})/m, $data);
foreach my $st (@stanzas){
 if($st =~ m/Expenses:(?!Unknown)\S+\s*$/m){
  if($st =~ m/Expenses:Unknown\s+(USD\s+-[0-9.]+)/){
     my $amount = $1; 
     $amount =~ s/-//;
     $st =~ s/Expenses:(?!Unknown)(\S+)(\s*)$/Expenses:$1                              $amount/m;
     $st =~ s/Expenses:Unknown(\s+USD\s+-[0-9.]+)/Expenses:Unknown/;
  }
 }
}
print join("", @stanzas);

Здесь функция split()использует шаблон просмотра -вперед (?=)для разделения всего ввода на строки с 4 цифрами в начале.

Для каждой строфы,если в нем есть Расходы, за которыми не следует Неизвестно, за которым следуют не -пробелы, а затем только пробелы, а за Неизвестно следует отрицательное число, число и предшествующий ему доллар США фиксируются, а минус удаляется.

Результат подставляется в первую совпавшую строку с некоторым фиксированным пространством и удаляется из неизвестной строки. Выполнение этого по отдельности позволяет этим двум полям располагаться в другом порядке в строфе.

Наконец, строфы объединяются и печатаются.

2
28.04.2021, 23:15

Используя Perl в режиме абзаца, мы будем обрабатывать абзац за раз и извлекать расходы в долларах США из неизвестного поля и вставлять их в другую строку расходов:

$ perl -p00 -e '
    my @A = /^\h+Expenses:Unknown(\h+USD\h+)-(\d+\.\d+)$/m;

    s/^\h+Expenses:\K((Unknown)\h|\S+).*$/$2 ? $2 : "$1@A"/gem if @A;
' file
0
28.04.2021, 23:15

Теги

Похожие вопросы