Как распознать текстовую строку и файл в bash, чтобы сохранить литерал \newpage на выходе?

У меня есть несколько файлов уценки, которые я пытаюсь объединить в один файл уценки в 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

Желаемый результат после группировки всех элементов в одну группу и добавления заголовка группы «Название группы 1» с \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

ожидаемый результат состоит из 3 элементов; пожалуйста, обновите вопрос, включив в него имена и содержимое файлов, из которых взяты эти 3 элемента.

markp-fuso 25.05.2024 19:38

dir_in и dir_out должны указывать на один и тот же каталог? вы читаете файлы *.md и записываете в файлы *.md; Как вы думаете, что произойдет, если вы запустите сценарий дважды?

markp-fuso 25.05.2024 19:39

как определить номер группы? это основано на имени файла? основано ли оно на анализе содержимого файлов .md? или есть какой-то другой метод определения номера группы?

markp-fuso 25.05.2024 19:41

@markp-fuso Добавлено 3 примера файлов .md, которые отображаются в выводе. Исправлены dir_in и dir_out. Группы пронумерованы для пояснения. На самом деле это имена (foo, bar и т. д.). Все элементы, принадлежащие определенной группе, находятся в папке с именем группы. Я создам цикл for для всех папок (следовательно, групп), сделаю его переменной и назову после нее имя группы в файле .md. Здесь его нет, просто чтобы было как можно короче, и я все еще работаю над этим. Здесь проблема заключается в том, что я не понимаю, как записать \newpage в файл, сохранив \n, чтобы он интерпретировался в уценке.

ThinkRat 25.05.2024 22:10

Попробуйте использовать escape-символ, в вашем случае это будет title='#Title of group 1 \\newpage', как указано в документации GNU: gnu.org/software/bash/manual/html_node/…. Отсюда, я думаю, ты можешь пойти сам, верно? _ол

Marco 25.05.2024 22:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
$ 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

Другие вопросы по теме