добавление строк в начало файла

Проблема заключалась в том, что я пытался записать в тот же файл, с которым работал. Если я использую временный файл, выведите его в 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
}

Я уверен, что есть более эффективные способы сделать это, но я не знаю ничего лучшего, это то, что я придумал и что буду использовать.

1
10.09.2017, 20:28
3 ответа

Я обнаружил, что это самое близкое к тому, что я искал. Идея временного буфера решает эту задачу. Другие решения намекают на циклы 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 {}" \;
0
27.01.2020, 23:44

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"-добавить нужную строку в начало файла

1
27.01.2020, 23:44

Вам нужно заключить *.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 {} ';'
0
27.01.2020, 23:44

Теги

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