Проблема заключалась в том, что я пытался записать в тот же файл, с которым работал. Если я использую временный файл, выведите его в 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
}
Я уверен, что есть более эффективные способы сделать это, но я не знаю ничего лучшего, это то, что я придумал и что буду использовать.
Я обнаружил, что это самое близкое к тому, что я искал. Идея временного буфера решает эту задачу. Другие решения намекают на циклы for, о которых, на мой взгляд, уже заботится комбинация find -exec.
https://unix.stackexchange.com/a/197400/119007
find./ -name '*.md' -exec sh -c "echo '{}' | sed 's/.md//' | sed 's/2000-01-01-//' > tmp && cat {} >> tmp && mv tmp {}" \;
to add the corresponding strings in each and every file in the beginning of the file
bash+sedподход:
for f in *.md; do fn=${f##*-}; sed -i "1 s/^/${fn%.*} /" "$f"; done
fn=${f##*-}
-усекает самую длинную совпавшую последовательность слева до последнего вхождения -
(, например.abcd.md
)
${fn%.*}
-усечение самой правой последовательности (с конца )до первого вхождения.
(точки )из предыдущей подстроки fn
(, т.е.abcd
)
sed -i "1 s/^/${fn%.*} /" "$f"
-добавить нужную строку в начало файла
Вам нужно заключить *.md
в кавычки в вашей команде find
, иначе она будет расширена до совпадающих имен при ее запуске. Вы также никогда не должны использовать {}
в цитируемом контексте (, см., например. Можно ли безопасно использовать `find -exec sh -c `?).
Вот решение для цикла оболочки:
for name in./*.md; do
prefix="${name%.md}" # "./2000-01-01-abcd.md" --> "./2000-01-01-abcd"
prefix="${prefix##*-}" # "./2000-01-01-abcd" --> "abcd"
{ echo "$prefix"; cat "$name"; } >"$name".tmp && mv "$name".tmp "$name"
done
То же самое сfind
:
find. -type f -maxdepth 1 -name "*.md" \
-exec sh -c 'p="${1%.md}";p="${p##*-}";{ echo "$p";cat "$1"; }>"$1".tmp && mv "$1".tmp "$1"' sh {} ';'