Я хочу добавить текст в файл, как echo "abc" >>file.txt
.
Но это добавить abc
после новой строки
Как я могу добавить abc
в конец файла с эхо без новой строки?
Я хочу добавить текст в файл, как echo "abc" >>file.txt
.
Но это добавить abc
после новой строки
Как я могу добавить abc
в конец файла с эхо без новой строки?
abc
без заключительного перевода строки, который (после прочтения вашего вопроса), похоже, не тот, который вы хотите.Ответы:
echo "abc" >>file.txt
ставит новую строку послеabc
, а не до. Если вы в конечном итогеabc
в своей собственной строке, это означает, что новая строка ранееabc
уже присутствовала вfile.txt
.Обратите внимание, что текстовый файл заканчивается новой строкой. В Unix строка состоит из последовательности символов, отличных от нуля или новой строки, за которой следует новая строка. 1 Поэтому любой непустой текстовый файл заканчивается символом новой строки.
Если вы хотите добавить текст в последнюю строку файла, вы не сможете это сделать
>>
, потому что он всегда добавляется в файл, поэтому он всегда пишет после последней новой строки. Вместо этого вам нужен инструмент, способный изменить существующий файл. Например, вы можете использовать sed :В команде sed первая
$
означает «выполнить следующую команду только в последней строке», командаs/REGEX/REPLACEMENT/
заменяет REGEX на REPLACEMENT, а регулярное выражение$
совпадает в конце строки.Linux команда sed имеет встроенную функцию для автоматизации этой последовательности создания нового файла и замены, так что вы можете сократить ее до
⁰ Это нулевой байт, который ASCII вызывает NUL, а Unicode - U + 0000. Программы обработки текста могут или не могут справиться с этим символом.
1 См. Определения текстового файла , строки и символа новой строки в разделе «Определения» главы «Основные определения» IEEE 1003.1-2008: 2016.
источник
0x41
(ASCII'A'
), это технически больше не текстовый файл? Если это так, я бы предложил подчеркнуть этот момент, так как это своего рода неинтуитивное определение; в противном случае небольшое изменение в формулировке может помочь избежать путаницы.Я не думаю, что это возможно с помощью
echo
команды,sed
вместо этого используйте следующий подход:-i
- изменить файл InPlace$
- указать последнюю запись / строкуs/$/abc/
- заменить конец строки$
подстрокойabc
(для последней записи)источник
date >file; ls -i file; sed -i 's/201/ZZZ/' file; ls -i file
Предполагая, что файл еще не заканчивается новой строкой, и вы просто хотите добавить еще текст без добавления одного, вы можете использовать
-n
аргумент, напримерОднако некоторые системы UNIX не предоставляют эту опцию; если это так, вы можете использовать
printf
, например,(начальный
%s
аргумент - защита от дополнительного текста, содержащего%
символы форматирования)От
man echo
(на macOS High Sierra):источник
echo -n
не ставит перевод строки в концеabc
, ноabc
все равно будет предшествовать перевод строки, чего пользователь хочет избежать.\n
в первую очередь. Чем больше вариантов, тем лучше, особенно если они не требуют перезаписи всего файла каждый раз, когда происходит изменение (которое может стать довольно медленным и запускаться за полиномиальное время, если это делается неоднократно).Если у вас есть
truncate
команда и ваш текстовый файл имеет NL в качестве последнего символа, вы можете удалить ее, а затем добавить свой текст следующим образом:(Обратите внимание, что это не
truncate
заботится о содержимом файла, и в этом примере просто уменьшает размер файла на один байт. Если ваш последний символ не является одиночным байтом, т.е. это многобайтовый "широкий" символ, то вы представите искажение.)источник
То, что вы хотите, это добавить его в конце последней строки, так что непосредственно перед разделителем этой последней строки, то есть перед последним символом файла.
С помощью
ksh93
вы можете сделать:Где
1<>
находится стандартный оператор для открытия файла в режиме чтения + записи (и, что более важно, без усечения ) на stdout, и>#((...))
это специфический для ksh93 оператор поиска (здесь для поиска перед последним байтом). Обратите внимание, чтоecho
пишет,abc<newline>
гдеa
перезаписывает новую строку, которая была там, иecho
добавляет свой новый перевод строки.zsh
Эквивалент:Хотя для более точного эквивалента вам также нужно будет напечатать сообщение об ошибке при невозможности поиска:
источник
Вероятно, UUOC, но вы также можете сделать:
Как указывает Жиль, эта команда ограничена:
Кроме того, будьте осторожны с
cat
файлами, с которыми вы не знакомы:Вывод :
Используйте sed
источник
echo
: pcat
, но с проблемами с произвольными escape-последовательностями, отправляемыми на терминал.