Я использую crudini для добавления и удаления разделов и параметров в ini-файле. После запуска crudini в файле остаются лишние пустые строки, которые я хочу очистить, так что каждый раздел отделяется только одной пустой строкой. Команда grep в следующей функции работает, но когда я пытаюсь перенаправить вывод в файл, в результате я получаю пустой файл.
Код
sctn="Section Two"
mypath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
my_ini=$mypath/test.ini
ini_sec=$sctn
function inidel () {
crudini --del --verbose $my_ini "$ini_sec"
grep -A1 . $my_ini | grep -v "^--$"
}
function iniadd () {
crudini --set --verbose $my_ini "$ini_sec"
grep -A1 . $my_ini | grep -v "^--$"
}
Данные test.ini
1| [Section One]
2| Parameter1=x1
3| Parameter2=example1
4| Parameter3=one
5|
6| [Section Two]
7| Parameter1=x2
8| Parameter2=example2
9| Parameter3=two
10|
11| [Section Three]
12| Parameter1=x3
13| Parameter2=example3
14| Parameter3=three
15|
Я пробовал использовать > $ my_ini
после команды grep. Я точно не знаю, что он делает на самом деле, но предполагаю, что он записывает результат для каждой строки, заканчивающейся последней пустой строкой. Если я использую >> $ my_ini
, он пишет правильно, но добавляет текст вместо его перезаписи.
Проблема заключалась в том, что я пытался записать в тот же файл, с которым работал. Если я использую временный файл, выведите его в my_ini, он работает.
Используя исходный код моего вопроса, это работает.
function inidel () {
crudini --del --verbose $my_ini "$ini_sec"
grep -A1 . $my_ini | grep -v "^--$" > tmpfile
cat tmpfile > $my_ini
}
Это тоже работает при использовании cat.
function inidel () {
crudini --del --verbose $my_ini "$ini_sec"
cat $my_ini > tmpfile
cat -s tmpfile > $my_ini
}
Я уверен, что есть более эффективные способы сделать это, но я не знаю ничего лучшего, это то, что я придумал и что буду использовать.
Двойная стрелка (>>) предназначена для добавления данных в файл,
Используйте одну стрелку (>) для перезаписи файла.