Как добавить несколько строк в файл

Это полезное 1 использование cat :

$ cat File1 File2 > CombinedFile

Сноски:

1. В отличие от бесполезного использования cat

2
29.01.2019, 16:25
4 ответа

Если вам нужно прочитать вывод команды, вы можете использовать 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

Точка сигнализирует об окончании режима ввода -, что означает, что последнее решение предполагает, что ваш текст не содержит строк, состоящих из одиночных точек.

5
27.01.2020, 21:49

Вы можете использовать простой текстовый редактор 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
3
27.01.2020, 21:49

Использование sed:

$ sed -e 'i1' -e 'i2' test.text
1
2
3
0
27.01.2020, 21:49

Самый безопасный способ сделать это — скопировать исходный файл во временное место и соединить новое содержимое с этим файлом со старым именем.:

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

для вставки данных из другого файла.

6
27.01.2020, 21:49

Теги

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