Это полезное 1 использование cat :
$ cat File1 File2 > CombinedFile
Сноски:
1. В отличие от бесполезного использования cat
Если вам нужно прочитать вывод команды, вы можете использовать ed
, как и в связанном вопросе, с этим вариантом:
ed -s test.txt <<< $'0r !echo stuff\nw\nq'
Этот r
считывает вывод команды echo stuff
в test.txt
после нулевой строки.
Чтобы вставить многострочный -текст перед первой строкой через здесь -документ, который вы должны запустить
ed -s test.txt <<EOT
1i
add some line
and some more
to the beginning
.
w
q
EOT
Точка сигнализирует об окончании режима ввода -, что означает, что последнее решение предполагает, что ваш текст не содержит строк, состоящих из одиночных точек.
Вы можете использовать простой текстовый редактор ex , который должен быть доступен почти во всех POSIX-совместимых системах.
Чтобы вставить в первую строку, просто выполните
ex -sc '1i|new first line' -cx test.txt
В случае добавления нескольких строк просто добавьте строки в цикле, при этом самый верхний элемент будет добавлен последним (как стек)
for number in 5 4 3 2 1; do
ex -sc '1i|'"$number"'' -cx newfile
done
или если вы хотите избежать многократных операций записи в файл, создайте переменную с многострочным -содержимым и вставьте ее напрямую
multiple_lines=$'line1\nline2\nline3\nline4\nline5\n'
ex -sc '1i|'"$multiple_lines"'' -cx newfile
Самый безопасный способ сделать это — скопировать исходный файл во временное место и соединить новое содержимое с этим файлом со старым именем.:
tmpfile=$(mktemp)
cp myfile "$tmpfile" &&
cat - "$tmpfile" <<NEW_CONTENTS >myfile
this is
new contents
at top of file
NEW_CONTENTS
rm "$tmpfile"
Обратите внимание, что сама команда cat
почти такая же, как ваша
cat myfile <<EOT >>myfile
1
2
3
EOT
Тем не менее, cat
нужно указать также прочитать свой стандартный ввод, что он и делает, когда одним из операндов его имени файла является -
. Мы также не можем перенаправить из исходного файла, а затем добавить результат в тот же файл, так как это создает цикл, который заставляет файл увеличиваться до тех пор, пока он не заполнит все пространство в разделе. Вот почему я сначала копирую файл во временный файл, а затем использую его для создания нового содержимого для старого имени.
Мы могли бы также
tmpfile=$(mktemp)
cat - myfile <<NEW_CONTENTS >"$tmpfile" &&
this is
new contents
at top of file
NEW_CONTENTS
mv "$tmpfile" myfile
То есть записать результат во временный файл, а затем переместить его так, чтобы он заменил оригинал. Однако такой порядок операций не гарантирует сохранения прав собственности и разрешений на myfile
.
Небольшая функция оболочки, которая принимает стандартный ввод и помещает его поверх заданного имени файла.:
paste_header () {
local tmpfile=$(mktemp)
trap "rm -f '$tmpfile'" EXIT
cat - "$1" >"$tmpfile" &&
cat "$tmpfile" >"$1"
}
То, как это написано, позволяет пользователю, например, интерактивно вставлять содержимое из буфера обмена,но не изменил бы исходный файл, если бы ввод был прерван Ctrl+C . Интерактивный ввод должен быть завершен нажатием Ctrl+D (, которое отправляет EOT
, то есть конец -текста -).
Функция будет использоваться как
paste_header filename
для интерактивной вставки добавляемых данных вfilename
(конец ввода с помощью Ctrl+D).
или
paste_header filename <otherfile
для вставки данных из другого файла.