Как записать литерал \n в файл как текст из терминала?

Я пишу это в терминале:

printf ' \n\necho -e \"writes (>> appends) in note.txt this text'\n'on 2lines (with "-e" and "'\n'" help)\" >> note.txt\n' > note.txt 

Я понимаю это в note.txt:

echo -e "writes (>> appends) in note.txt this textnon 2lines (with "-e" and "n" help)" >> note.txt

Я хочу получить это в note.txt:

echo -e "writes (>> appends) in note.txt this text\non 2lines (with "-e" and "\n" help)" >> note.txt

(\- пропал, отсутствует)

5 ответов

Способ 1: побег экземпляров \ что вы не хотите избегать других персонажей.

Основываясь на содержимом вашей строки, вы, вероятно, хотите:

echo -e 'writes (>> appends) in note.txt this text\non 2 lines (with "-e" and "\\n" help)' >> note.txt

Текст, к которому это добавляется note.txt является:

writes (>> appends) in note.txt this text
on 2 lines (with "-e" and "\n" help)

Изменения:

  • Ты имел /n где выглядело, как будто вы хотели разрыва строки. Так что я изменил это на \n,
  • В тексте with "-e" and "\n", \ предназначен для печати буквально, а не в сочетании с n следуя за ним и произвести новую строку. Поэтому я процитировал (сбежал) \ с другим \, Если \n производит новую линию, \\n производит \n,
  • Я заменил внешние двойные кавычки (") с одинарными кавычками ('). Вы хотели " персонажи вокруг -e а также \n печататься буквально, но вместо этого они заканчивали и возобновляли цитирование, предотвращая их печать и вызывая \n на самом деле печататься как n (потому что без кавычек \n обрабатывается перед передачей в echo). Альтернативным решением было бы написать \" для внутренней части " персонажи. Но не было никакой причины заключать все это в двойные кавычки - одинарные кавычки обычно предпочтительнее в тех случаях, когда можно использовать любой из них.

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

Это стилистически ближе всего к тому, что у вас уже было, но это не единственный способ сделать это.

Способ 2: отдельный echo команды для отдельных строк вместо использования -e,

Поскольку единственная последовательность, которую вы хотите обработать специально с помощью echo, это \n (между text а также on), вы можете просто использовать два отдельных echo команды и (как может предполагать Муру) не использовать -e,

Вот два способа перенаправления вывода нескольких команд:

  1. Два отдельных перенаправления, по одному для каждой команды.

    echo 'writes (>> appends) in note.txt this text' >> note.txt
    echo 'on 2 lines (with "-e" and "\n" help)' >> note.txt
    

    Если имя файла длинное или вы пишете скрипт и хотите изменить его только в одном месте, вы можете назначить его переменной:

    out="/home/ek/Documents/long name that can have spaces as it's quoted/note.txt"
    echo 'writes (>> appends) in note.txt this text' >> "$out"
    echo 'on 2 lines (with "-e" and "\n" help)' >> "$out"
    
  2. Одно перенаправление применяется к составной команде, состоящей из двух команд.

    {
        echo 'writes (>> appends) in note.txt this text'
        echo 'on 2 lines (with "-e" and "\n" help)'
    } >> note.txt
    

    Вы можете поместить это в одну строку, если хотите, но если до закрывающей скобки нет новой строки (}), точка с запятой (;) должен предшествовать этому:

    { echo 'writes (>> appends) in note.txt this text'; echo 'on 2 lines (with "-e" and "\n" help)'; } >> note.txt

Способ 3: передать буквальный \n в echo Вместо того, чтобы использовать -e,

Реальные символы новой строки могут появляться внутри кавычек (одинарных или двойных) и интерпретируются буквально:

echo 'writes (>> appends) in note.txt this text
on 2 lines (with "-e" and "\n" help)' >> note.txt

Поскольку первая строка заканчивается внутри кавычек, оболочка не воспринимает ее как конец команды, а вместо этого продолжает чтение.

Если вы хотите разместить его на одной строке, вы можете использовать $'\n', который расширяется до новой строки. Это расширяется оболочкой перед передачей в echo команда, поэтому она не должна быть в кавычках.

echo 'writes (>> appends) in note.txt this text'$'\n''on 2 lines (with "-e" and "\n" help)' >> note.txt

Способ 4: использование printf

printf очень мощный; Есть несколько способов использовать его для решения этой проблемы. Поскольку я представляю это как отличное решение от других, вот хороший способ использовать его так, как вы не можете его использовать echo:

printf '%s\n%s\n' 'writes (>> appends) in note.txt this text' 'on 2 lines (with "-e" and "\n" help)' >> note.txt

Общий синтаксис для printf является printf format args... (где args... означает ноль или более дополнительных аргументов командной строки). Строка формата выше, %s\n%s\n, средства:

  1. %s: потреблять и печатать следующий неиспользуемый (т.е. первый) аргумент в args... (т. е. ваша первая строка).
  2. \n: напечатать новую строку.
  3. %s: потреблять и печатать следующий неиспользованный (т.е. второй) аргумент в args... (т.е. ваша вторая строка).
  4. \n: напечатать новую строку.

Если после строки формата имеется больше аргументов, чем требует строка формата, printf Команда начинается с начала строки формата. Таким образом, в то время как меньше самодокументирования, вы могли бы написать просто '%s\n' (вместо '%s\n%s\n') для строки формата, и в этом случае она выдаст тот же результат.

Я не буду пытаться широко документировать printf Вот. Вместо этого смотрите:

Способ 5: использование cat и здесь документ.

Этот способ особенно полезен, когда много информации и сценарии. Если вы используете оболочку в интерактивном режиме, а не пишете скрипт, вы можете использовать это, но сначала рассмотрите способ 6 ниже.

В то время как echo а также printf печатать текст на основе содержимого аргументов командной строки, cat печатает содержимое своих входных файлов (как указано в командной строке) или, если не задано (или передано) -), его стандартный ввод.

Без перенаправлений стандартный ввод - это то, что вы вводите на управляющем терминале программы. Здесь документы представляют собой особый вид перенаправления. Строки собираются до указанного ключевого слова (я использовал EOF) появляется сама по себе в строке. Затем линии до, но не включая EOF (или что вы использовали) приведены в качестве стандартного ввода для запускаемой команды.

cat >> note.txt << EOF
writes (>> appends) in note.txt this text
on 2 lines (with "-e" and "\n" help)
EOF

Одно из различий между цитированием " а также ' является то, что большинство расширений и замен с $ (например, $varname) выполняются в двойных кавычках, но ни в одинарных. Есть также два способа использования здесь документов, в зависимости от того, $ (а также ` а также \) должны иметь особое значение или трактоваться буквально.

В этом случае это не имеет значения $ а также ` не появляются, и \ рассматривается только в специальном документе здесь, когда экранирует метасимвол оболочки (не n). Как и в одинарных и двойных кавычках, оба способа обрабатывают \n в прямом смысле. (Помните, вы должны были использовать особую функцию echo, включенный -e, получить \n лечится специально.)

Но так вы знаете, для других приложений:

  • Способ, показанный выше, будет выполнять расширения и замены, обрабатывая $, `, а также \ особенно когда они появляются в контексте, где применяется их особое значение.
  • Чтобы весь текст воспринимался буквально, укажите все или часть слова, появляющегося справа от << с ', ", \ или их комбинация (например, cat >> note.txt << 'EOF').

Способ 6: использование cat без перенаправления ввода.

Если вы используете оболочку в интерактивном режиме, по умолчанию стандартный ввод оболочки берется из вашего терминала. Когда вы затем запускаете программу, по умолчанию стандартный ввод этой программы также берется с вашего терминала. (Это может быть изменено путем перенаправления ввода, конечно.)

Так что если вы запускаете команду в интерактивном режиме и хотите использовать cat с >> или же > перенаправление вывода для отправки данных в файл, перенаправление ввода не требуется. Просто введите:

cat >> note.txt
writes (>> appends) in note.txt this text
on 2 lines (with "-e" and "\n" help)
^D

На месте ^D не вводите буквальный ^D, Вместо этого нажмите Ctrl + D. Это сигнализирует вашему терминалу, что он должен сообщить об окончании файла (то есть, когда запущенная программа запрашивает дополнительный ввод, ему сообщают, что ничего не осталось, как если бы он достиг конца обычного файла, хранящегося на диске), когда cat видит, что больше нет ввода, он завершается, и вы возвращаетесь в оболочку.

Если вы пишете сценарий, способ 6 не будет работать, потому что bash читает команды из файла, но стандартный ввод по-прежнему (как правило) является чем-то другим, например, вашим терминалом.

Одно заметное различие между использованием cat с документом here и использованием cat без перенаправления ввода, даже если стандартный ввод является вашим терминалом, это:

  • cat >> note.txt пишет по одной строке за раз note.txt, Каждый раз, когда вы нажимаете Enter, строка записывается в note.txt,
  • cat >> note.txt << EOF принимает весь вклад до EOF линии, а затем добавляет его к note.txt, Если вы прервете ввод нажатием Ctrl + C, ничего не будет написано (и если note.txt не существовало, оно даже не создано).

Характер \ также является escape-символом для себя, так что вы можете добавить дополнительный \ вот так:

mgodby@mg-ws1:~$ echo -e '\n'


mgodby@mg-ws1:~$ echo -e '\\n'
\n
mgodby@mg-ws1:~$ 

Оболочка обрабатывает специальные символы, такие как обратный слеш, за исключением случаев, когда она заключена в одинарные кавычки.

echo принимает аргументы, начинающиеся с тире, поэтому для большей безопасности вы должны использовать printf вместо этого, вот так:

$ printf %s 'A \n B \n'
A \n B \n

%s просто означает напечатать строку, которую я передаю в качестве аргумента. Это часто используется так:

$ variable=Flimm
$ printf '%s is all right\n' "$variable"
Flimm is all right

Вы можете узнать больше об интерполяции Bash на странице руководства для bash команда Значок Manpage, найдите раздел, озаглавленный "ЦИТИРОВАНИЕ". Также посмотрите на справочную страницу для printf команда Значок Manpage,

Ну, я надеюсь, что это удовлетворяет ваши потребности:

  1. Нажмите, Ctrl+Alt+T
  2. Введите следующую команду:
    nano
  3. Для вас откроется редактор в терминале.
  4. Введите, что вы хотите, в вашем случае:
    echo -e 'writes(>> appends) in note.txt this text/non 2lines (with "-e" and "\n" help)' >> note.txt (вот что я получил от твоего вопроса)
  5. Сохранить и выйти,
    • Нажмите, Ctrl+X
    • Будет запрошено подтверждающее сообщение для сохранения, нажмите клавишу y
    • Введите имя вашего файла, нажмите Enter
  6. Проверять,
    • Откройте диспетчер файлов, вы увидите файл, который вы сохранили.
    • Вы, вероятно, найдете весь свой текст (в том числе "\n")

Еще один способ:

perl -e 'print q {
это сохраняет \n обратную косую черту
и другие специальные символы, кроме ближнего боя 
(без подходящего открытого закорючка, что было бы очень редко)
}' > note.txt

если ваша заметка имеет близкое зацикливание, вы можете выбрать другой разделитель для функции q():

perl -e 'print q |

это работает даже с непревзойденным близким приседанием
как этот: }

но это не работает, если у меня есть труба в моем тексте...

|" > note.txt

конечно, все эти методы (perl или native printf) потерпят неудачу, если внутри документа есть одинарные кавычки. в этом случае вы можете использовать двойные кавычки (если в тексте нет одинарных и двойных), например

printf% s "Я идиот"

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