У меня есть несколько файлов уценки, которые я пытаюсь объединить в один файл уценки в bash. Я могу объединить файлы уценки и сохранить строки «\newpage», но при попытке добавить заголовок группы с помощью строки, вызывающей echo для каждой группы, литерал \newpage в файле не сохраняется. Я новичок в bash и учусь по ходу дела. Как я могу добиться этого, не создавая файл, просто сохраняющий имя группы с помощью \newpage?
## Item 1 of group 1
Text to item 1 of group 1.
\newpage
## Item 2 of group 1
Text to item 2 of group 1.
\newpage
## Item 1 of group 2
Text to item 1 of group 2.
\newpage
# Title of group 1
\newpage
## Item 1 of group 1
Text to item 1 of group 1.
\newpage
## Item 2 of group 1
Text to item 2 of group 1.
\newpage
# Title of group 2
\newpage
## Item 1 of group 2
Text to item 2 of group 2.
\newpage
Я могу группировать элементы в каждый файл уценки групп, используя следующий код (эта часть работает, и \newpage сохраняется:
dir_in = "/path/do/input_directory/"
dir_out = "/path/do/output_directory/"
file = "group_1"
for f in ${dir_in}${file}/*.md; do cat $f >> ${dir_out}${file}.md; echo >> ${dir_out}${file}.md; done
Как мне отредактировать приведенный выше код, чтобы я мог добавить имя группы «# Название группы 1 \newpage» из строковой переменной?
Я попытался превратить заголовок в переменную и повторить его с содержимым сгруппированного файла уценки.
title = "#Title of group 1 \newpage"
content=$(cat "${dir_out}${file}.md")
result=$(echo "${title}\n\n${content}")
echo "$result" > ${dir_out}${file}.md
Но echo интерпретирует каждый \n, печатает символы новой строки и оставляет «ewpages» в файле.
#Title of group 1
ewpage
dir_in и dir_out должны указывать на один и тот же каталог? вы читаете файлы *.md и записываете в файлы *.md; Как вы думаете, что произойдет, если вы запустите сценарий дважды?
как определить номер группы? это основано на имени файла? основано ли оно на анализе содержимого файлов .md? или есть какой-то другой метод определения номера группы?
@markp-fuso Добавлено 3 примера файлов .md, которые отображаются в выводе. Исправлены dir_in и dir_out. Группы пронумерованы для пояснения. На самом деле это имена (foo, bar и т. д.). Все элементы, принадлежащие определенной группе, находятся в папке с именем группы. Я создам цикл for для всех папок (следовательно, групп), сделаю его переменной и назову после нее имя группы в файле .md. Здесь его нет, просто чтобы было как можно короче, и я все еще работаю над этим. Здесь проблема заключается в том, что я не понимаю, как записать \newpage в файл, сохранив \n, чтобы он интерпретировался в уценке.
Попробуйте использовать escape-символ, в вашем случае это будет title='#Title of group 1 \\newpage', как указано в документации GNU: gnu.org/software/bash/manual/html_node/…. Отсюда, я думаю, ты можешь пойти сам, верно? _ол





$ title='#Title of group 1 \newpage'
$ printf '%s\n' "$title"
#Title of group 1 \newpage
$
См. Why-is-printf-better-than-echo , чтобы узнать о проблемах с echo, см. https://mywiki.wooledge.org/Quotes , чтобы узнать, когда использовать одинарные, двойные или отсутствие кавычек и всегда запускайте свой код через http://shellcheck.net, пока не познакомитесь с программированием оболочки.
Предположения/понимания:
${dir_in} находится набор подкаталогов*.md, который состоит из заголовка группы, за которым следует содержимое всех файлов в подкаталоге «группа».Нам не предоставлено полное представление о входных данных (т. е. мы не знаем ни имен каталогов/групп, ни имен файлов), поэтому я взмахнул волшебной палочкой и получил следующее:
$ ls -l
drwxrwx---+ 1 username None 0 May 25 15:29 group1/
drwxrwx---+ 1 username None 0 May 25 15:29 group2/
$ ls -l group*
group1:
-rw-rw----+ 1 username None 59 May 25 15:29 item1.md
-rw-rw----+ 1 username None 59 May 25 15:29 item2.md
group2:
-rw-rw----+ 1 username None 59 May 25 15:29 item1.md
$ head group*/*md
==> group1/item1.md <==
## Item 1 of group 1
Text to item 1 of group 1.
\newpage
==> group1/item2.md <==
## Item 2 of group 1
Text to item 2 of group 1.
\newpage
==> group2/item1.md <==
## Item 1 of group 2
Text to item 1 of group 2.
\newpage
Есть несколько способов разобрать это на кусочки (например, *.md, bash, awk), но для этого ответа мы остановимся на python решении:
dir_in=.
dir_out=.
for group in "${dir_in}"/*
do
[[ ! -d "${group}" ]] && continue
outfile = "${dir_out}/${group}.md"
printf '# Title of group %s\n\n\\newpage\n' "${group##*/}" > "${outfile}"
for mdfile in "${group}"/*.md
do
echo ""
cat "${mdfile}"
done >> "${outfile}"
done
ПРИМЕЧАНИЕ. мы будем использовать bash, так как с ним проще обрабатывать специальные символы (например, printf) и escape-последовательности (\n => \\newpage).
Полученные результаты:
$ ls -l
drwxrwx---+ 1 username None 0 May 25 15:29 group1/
-rw-rw----+ 1 username None 154 May 25 15:34 group1.md
drwxrwx---+ 1 username None 0 May 25 15:29 group2/
-rw-rw----+ 1 username None 94 May 25 15:34 group2.md
$ cat group1.md
# Title of group group1
\newpage
## Item 1 of group 1
Text to item 1 of group 1.
\newpage
## Item 2 of group 1
Text to item 2 of group 1.
\newpage
$ cat group2.md
# Title of group group2
\newpage
## Item 1 of group 2
Text to item 1 of group 2.
\newpage
ожидаемый результат состоит из 3 элементов; пожалуйста, обновите вопрос, включив в него имена и содержимое файлов, из которых взяты эти 3 элемента.