Как записать литерал \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

(\- отсутствует),

4
задан 8 October 2014 в 05:55

5 ответов

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

  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. Проверять,
    • Откройте File Manager, Вы будете видеть файл, который Вы сохранили.
    • Вы будете, вероятно, найти весь Ваш текст (включая, "\n")
1
ответ дан 17 November 2019 в 13:47

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

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 icon , искать наделенное правом ЗАКЛЮЧЕНИЕ В КАВЫЧКИ раздела. Также посмотрите страница справочника для printf команда Manpage icon .

1
ответ дан 17 November 2019 в 13:47

Символ \ является также символом ESC для себя, таким образом, можно добавить [еще 112] как так:

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


mgodby@mg-ws1:~$ echo -e '\\n'
\n
mgodby@mg-ws1:~$ 
1
ответ дан 17 November 2019 в 13:47

еще один путь:

perl -e 'print q{
this preserves \n backslash-n
and other special characters except close-squiggle 
(without a matching open-squiggle, which would be very rare)
}' > note.txt

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

perl -e 'print q|

this works even with an unmatched close-squiggle
like this one: }

but it doesnt workt if i have a pipe in my text...

|' > note.txt

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


printf %s " I'm an idiot"

0
ответ дан 17 November 2019 в 13:47

Путь 1: экземпляры Escape \ то, что Вы не хотите выходить из других символов.

На основе содержания Вашей строки Вы, вероятно, хотите:

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.

Начиная с единственной последовательности Вы хотите рассматриваемый особенно эхом, \n (между text и on), можно просто использовать два отдельных echo команды и (поскольку muru может предлагать) не используют -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... (т.е. Ваша 1-я строка).
  2. \n: распечатайте новую строку.
  3. %s: используйте и распечатайте следующее неиспользованное (т.е. второй) аргумент в args... (т.е. Ваша 2-я строка).
  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 не будет работать, потому что команды чтений удара из файла, но стандартного входа являются все еще (обычно) чем-то еще, таким как Ваш терминал.

Заметные различия между использованием cat со здесь кошка документ и использование без перенаправления ввода, даже когда стандартный вход является Вашим терминалом, то, что:

  • cat >> note.txt записи одна строка за один раз к note.txt. Каждый раз, когда Вы нажимаете Enter, строка записана в note.txt.
  • cat >> note.txt << EOF берет весь вход до EOF строка, затем добавляет его к note.txt. При прерывании входа путем нажатия Ctrl+C ничто не записано (и если note.txt уже не существовал, это даже не создается).
8
ответ дан 23 November 2019 в 11:42

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

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