Я хочу написать несколько предопределенных текстов в файл со следующим:
text="this is line one\n
this is line two\n
this is line three"
echo -e $text > filename
Я ожидаю что-то вроде этого:
this is line one
this is line two
this is line three
Но получил это:
this is line one
this is line two
this is line three
Я уверен, что после каждого нет места \n
, но как получается дополнительное место?
text="this is line one\nthis is line two\nthis is line three"
в одной строке ..? (без входа)\n
на каждой строке, вы уже нажали новую строку, чтобы перейти на новую строку\n
почему вы ставите следующую строку в новой строке? Простоtext="this is line one\nthis is line two\nthis is line three"
\n
в конце каждой строки приводит к тому, что все выходные данные выводятся в одну строку."$text"
линии эха очень важно. Без них ни один из символов новой строки (как буквальный, так и '\ n') не работает. С ними они все делают.Ответы:
Эредок звучит для этого удобнее. Он используется для отправки нескольких команд в программу интерпретатора команд, например ex или cat
Строка после
<<
указывает, где остановиться.Чтобы отправить эти строки в файл, используйте:
Вы также можете сохранить эти строки в переменной:
Это сохраняет строки в переменной с именем
VAR
.При печати запомните кавычки вокруг переменной, иначе вы не увидите символы новой строки.
Более того, вы можете использовать отступы, чтобы они выделялись в вашем коде. На этот раз просто добавьте
-
после,<<
чтобы остановить появление вкладок.Но тогда вы должны использовать табуляции, а не пробелы, для отступа в вашем коде.
источник
-d
опции вread -r -d '' VARIABLE <<- EOM
не работало для меня.Если вы пытаетесь получить строку в переменную, другой простой способ выглядит примерно так:
Если вы сделаете отступ для строки с помощью табуляции (то есть '\ t'), отступ будет удален. Если вы сделаете отступ с пробелами, отступ останется в.
ПРИМЕЧАНИЕ: Это является существенным , что последняя закрывающая скобка находится на другой линии.
END
Текст должен появиться на отдельной строке.источник
)
той же линии. Я думаю, это потому, что то, что происходит между$(
и)
будет выполняться в своей собственной вселенной, и настоящая команда не увидит ')' в любом случае. Интересно, работает ли это и на других?echo
добавляет пробелы между аргументами, переданными ему.$text
подвержен расширению переменных и разбиению слов, поэтому вашаecho
команда эквивалентна:Вы можете видеть, что пробел будет добавлен перед "этим". Вы можете удалить символы новой строки и заключить
$text
в кавычки, чтобы сохранить новые строки:Или вы можете использовать
printf
, который является более надежным и портативным, чемecho
:В
bash
, который поддерживает расширение скобок, вы могли бы даже сделать:источник
в скрипте bash работает следующее:
альтернативно:
имя файла кошки дает:
источник
-e
вариант дляecho
. Пожалуйста, попробуйте еще раз.Я нашел больше решений, так как я хотел, чтобы каждая строка имела правильный отступ:
Вы можете использовать
echo
:Это не сработает, если вы поставите
"\n"
непосредственно перед\
концом строки.Кроме того, вы можете использовать
printf
для лучшей переносимости (у меня было много проблем сecho
):Еще одно решение может быть:
или
Другое решение достигается путем смешивания
printf
иsed
.Реорганизовать код, отформатированный таким образом, нелегко, поскольку вы жестко закодировали уровень отступа в коде.
Можно использовать вспомогательную функцию и некоторые приемы подстановки переменных:
источник
Ниже приведен мой предпочтительный способ назначения многострочной строки переменной (я думаю, это выглядит хорошо).
Количество подчеркиваний одинаково (здесь 80) в обоих случаях.
источник
Просто упомянуть простую конкатенацию в одну строку, так как иногда это может быть полезно.
Вы получите что-то вроде этого
Все начальные и конечные пробелы будут сохранены
источник
Есть много способов сделать это. Для меня хорошо , если вставить строку с отступом в sed .
Этот ответ был основан на ответе Матеуша Петровского , но немного уточнен.
источник
это будет работать, если вы поставите его как показано ниже:
источник