Если документ здесь должен быть добавлен только в том случае, если его нет, вы можете использовать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
ничего не находит.
Самый простой способ использования 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 цифрами в начале.
Для каждой строфы,если в нем есть Расходы, за которыми не следует Неизвестно, за которым следуют не -пробелы, а затем только пробелы, а за Неизвестно следует отрицательное число, число и предшествующий ему доллар США фиксируются, а минус удаляется.
Результат подставляется в первую совпавшую строку с некоторым фиксированным пространством и удаляется из неизвестной строки. Выполнение этого по отдельности позволяет этим двум полям располагаться в другом порядке в строфе.
Наконец, строфы объединяются и печатаются.
Используя 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