Привет, я хочу добавить текст в файл. Например, я хочу добавить задачи в начало файла todo.txt. Я знаю, echo 'task goes here' >> todo.txtно это добавляет строку в конец файла (не то, что я хочу).
первый работает отлично! не могли бы вы объяснить логику? Я не совсем уверен, как интерпретировать синтаксис.
user479534
44
@ user8347: Pipe ( |) сообщение ( echo '...'), для catкоторого используется -(стандартный ввод) в качестве первого файла и todo.txtв качестве второго. catconCATenates несколько файлов. Отправьте вывод ( >) в файл с именем temp. Если нет ошибок ( &&), catпереименуйте ( mv) tempфайл обратно в исходный файл ( todo.txt).
Деннис Уильямсон
1
@itaifrenkel: Я бы посмотрел, что ты сделал, но если catполучит буквальную обратную косую черту, он не будет преобразован в новую строку. Что-то еще, должно быть, сделало это. Вместо этого catпопробуйте подключиться, hexdump -Cчтобы увидеть, действительно ли вы отправляете обратную косую черту и n или символ новой строки. Вы также можете попытаться cat -eпоказать окончание строк.
Деннис Уильямсон
1
Использование 2 и 3 (мне кажется, что 3 проще) позволяет добавлять текст ко многим файлам одновременно.
Феликс
4
@Kira: 1Средство делает следующую команду только в первой строке файла, а iкоманда вставляется. Посмотрите справочную страницу в разделе «Адреса» и в разделе «Команды с нулевым или одноадресным адресом».
Это работает, потому что команда внутри $(...)выполняется прежде, чем todo.txtбудет перезаписана> todo.txt
В то время как другие ответы работают хорошо, я нахожу это намного легче запомнить, потому что я использую echo и cat каждый день.
РЕДАКТИРОВАТЬ: Это решение очень плохая идея, если есть какие-либо обратные слеши todo.txt, потому что благодаря -eфлагу echo будет их интерпретировать. Еще один, гораздо более простой способ получить перевод строки в предисловие ...
echo "task goes here
$(cat todo.txt)"> todo.txt
... просто использовать переводы строки. Конечно, это уже не одна строка, но на самом деле, раньше она тоже не была одной строкой. Если вы делаете это внутри скрипта и беспокоитесь о отступах (например, вы выполняете это внутри функции), есть несколько обходных путей, чтобы сделать это по-прежнему подходящим, включая, но не ограничиваясь:
Кроме того, если вы заботитесь о том, будет ли добавлена новая строка в конце todo.txt, не используйте их. Ну, кроме второго до последнего. Это не портит конец.
Он «впитает» STDIN и затем запишет в файл, что означает, что вам не нужно беспокоиться о временных файлах и их перемещении.
Вы можете получить moreutilsдоступ ко многим дистрибутивам Linux, через apt-get install moreutilsили в OS X, используя Homebrew , с помощью brew install moreutils.
Скажем, у вас недостаточно места на диске, так что new_todo.txtзаписывается только частично. Ваше решение, похоже, потеряет исходный файл.
NPE
У кого заканчивается дисковое пространство? ;-) Это просто простой пример.
Кит
2
@Keith Кто-то работает на виртуальной машине и не ожидал, что ей понадобится особенно большой виртуальный диск. Или кто-то перемещает большой файл. В любом случае, реальный аргумент против этого - права доступа к каталогу; если у вас нет разрешения на создание новых файлов в данном каталоге, единственная команда, которая будет успешно выполнена в вашем сценарии, - rmэто исходный файл.
Парфянский выстрел
3
Если текстовый файл достаточно мал, чтобы поместиться в памяти, вам не нужно создавать временный файл для его замены. Вы можете загрузить все это в память и записать обратно в файл.
Просто чтобы задать очевидный вопрос: где предел символов переменных оболочки?
Никда
Насколько я знаю, он ограничен только объемом доступной памяти. Я заполнил переменные более 100 МБ в памяти. text=$(cat file), Будьте осторожны, чтобы использовать только текст, потому что переменные оболочки не являются двоичными чистыми mywiki.wooledge.org/BashFAQ/058
Rucent88
2
Вы не можете вставить содержимое в начале файла. Единственное, что вы можете сделать, это либо заменить существующий контент, либо добавить байты после текущего конца файла.
Любое решение вашего вопроса требует создания временного файла (или буфера) (в памяти или на диске), который в конечном итоге перезапишет исходный файл.
Остерегайтесь потери данных, сохраняя исходный файл при создании нового, если файловая система окажется переполненной во время процесса. например:
Downvoters могут объяснить свою мотивацию. Ни один из оставшихся ответов, включая принятый, в моем ответе не противоречит.
jlliagre
Это трудно разобрать, так как <...> выглядят как скобки, что, я полагаю, не так. Пробел между <и (может помочь?
Дамблдад
Это не работает для меня. echo HOME=\"/g/Users/timregan/\" | cat - 'F:\Program Files\Git\etc\profile'работает, но cat <echo HOME=\"/g/Users/timregan/\" 'F:\Program Files\Git\etc\profile'выдает ошибку "echo: нет такого файла или каталога"
dumbledad
@dumbledad Вы думаете над моим ответом. Вам нечего в этом разбирать. Пробел между <и (нарушает синтаксис. Попробуйтеcat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile'
jlliagre
1
Вы можете использовать tee:
echo 'task goes here'| cat - todo.txt | tee todo.txt
Ответы:
или же
или же
источник
|
) сообщение (echo '...'
), дляcat
которого используется-
(стандартный ввод) в качестве первого файла иtodo.txt
в качестве второго.cat
conCATenates несколько файлов. Отправьте вывод (>
) в файл с именемtemp
. Если нет ошибок (&&
),cat
переименуйте (mv
)temp
файл обратно в исходный файл (todo.txt
).cat
получит буквальную обратную косую черту, он не будет преобразован в новую строку. Что-то еще, должно быть, сделало это. Вместо этогоcat
попробуйте подключиться,hexdump -C
чтобы увидеть, действительно ли вы отправляете обратную косую черту и n или символ новой строки. Вы также можете попытатьсяcat -e
показать окончание строк.1
Средство делает следующую команду только в первой строке файла, аi
команда вставляется. Посмотрите справочную страницу в разделе «Адреса» и в разделе «Команды с нулевым или одноадресным адресом».На мой взгляд, более простой вариант:
Это работает, потому что команда внутри
$(...)
выполняется прежде, чемtodo.txt
будет перезаписана> todo.txt
В то время как другие ответы работают хорошо, я нахожу это намного легче запомнить, потому что я использую echo и cat каждый день.
РЕДАКТИРОВАТЬ: Это решение очень плохая идея, если есть какие-либо обратные слеши
todo.txt
, потому что благодаря-e
флагу echo будет их интерпретировать. Еще один, гораздо более простой способ получить перевод строки в предисловие ...... просто использовать переводы строки. Конечно, это уже не одна строка, но на самом деле, раньше она тоже не была одной строкой. Если вы делаете это внутри скрипта и беспокоитесь о отступах (например, вы выполняете это внутри функции), есть несколько обходных путей, чтобы сделать это по-прежнему подходящим, включая, но не ограничиваясь:
Кроме того, если вы заботитесь о том, будет ли добавлена новая строка в конце
todo.txt
, не используйте их. Ну, кроме второго до последнего. Это не портит конец.источник
-e
преобразует ли также escape-последовательности внутри todo.txt?moreutils
Есть хороший инструмент под названиемsponge
:Он «впитает» STDIN и затем запишет в файл, что означает, что вам не нужно беспокоиться о временных файлах и их перемещении.
Вы можете получить
moreutils
доступ ко многим дистрибутивам Linux, черезapt-get install moreutils
или в OS X, используя Homebrew , с помощьюbrew install moreutils
.источник
(echo 'ble'; cat todo.txt)
:-)Вы можете использовать Vim в режиме Ex:
1
выберите первую строкуi
вставитьx
сохранить и закрытьисточник
Вы можете создать новый временный файл.
Вы также можете использовать
sed
илиawk
. Но в основном происходит то же самое.источник
new_todo.txt
записывается только частично. Ваше решение, похоже, потеряет исходный файл.rm
это исходный файл.Если текстовый файл достаточно мал, чтобы поместиться в памяти, вам не нужно создавать временный файл для его замены. Вы можете загрузить все это в память и записать обратно в файл.
Невозможно добавить строки в начало файла без перезаписи всего файла.
источник
text=$(cat file)
, Будьте осторожны, чтобы использовать только текст, потому что переменные оболочки не являются двоичными чистыми mywiki.wooledge.org/BashFAQ/058Вы не можете вставить содержимое в начале файла. Единственное, что вы можете сделать, это либо заменить существующий контент, либо добавить байты после текущего конца файла.
Любое решение вашего вопроса требует создания временного файла (или буфера) (в памяти или на диске), который в конечном итоге перезапишет исходный файл.
Остерегайтесь потери данных, сохраняя исходный файл при создании нового, если файловая система окажется переполненной во время процесса. например:
источник
echo HOME=\"/g/Users/timregan/\" | cat - 'F:\Program Files\Git\etc\profile'
работает, ноcat <echo HOME=\"/g/Users/timregan/\" 'F:\Program Files\Git\etc\profile'
выдает ошибку "echo: нет такого файла или каталога"<
и(
нарушает синтаксис. Попробуйтеcat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile'
Вы можете использовать
tee
:источник
GitBash + Windows10 + Multline :
Вот версия, которая позволяет вам использовать многострочные строки .
источник