У меня есть два файла file1, содержащие -

hello world
hello bangladesh  

И file2, содержащие -

Dhaka in Bangladesh
Dhaka is capital of Bangladesh  

Я хочу новый file2 как -

hello world
hello bangladesh 
Dhaka in Bangladesh
Dhaka is capital of Bangladesh

Это делается -

cat file1 file2 >> file3
mv file3 file2  

Но я не хочу создавать новый файл. Думаю, с помощью sed это возможно.

-1
user8874182 3 Янв 2018 в 04:26

2 ответа

Лучший ответ

Конечно, это возможно.

printf '%s\n' '0r file1' x | ex file2

Это POSIX-совместимая команда, использующая ex, указанную в POSIX невизуальный предшественник vi.

printf используется здесь только для передачи команды редактору. Что выводит printf:

0r file1
x

x - сохранение и выход.

r "читается в содержимом указанного файла".

0 указывает номер строки, после которой должен быть помещен текст для чтения.

N.B. Этот ответ полностью скопирован из Можно ли добавить текст в начало файла в интерфейсе командной строки без создания нового файла?

Другое решение
Существует не так много способов изменить файлы на месте с помощью стандартных инструментов. Даже если они кажутся таковыми, они могут использовать временные файлы (например, GNU sed -i).

ex, с другой стороны, поможет:

ex +'0r file2' +wq file1

ex - это строковый редактор, и vim произошел от него, поэтому эти команды могут показаться вам знакомыми. 0r filename делает то же самое, что и :0r filename в vim: вставляет указанный файл после указанного адреса (номера строки). Номер строки здесь 0, это своего рода виртуальная строка, которая представляет строку перед строкой 1. Таким образом, файл будет вставлен перед любым существующим текстом.

Затем у нас есть wq, который сохраняет и завершает работу.

Вот и все.

N.B. Этот ответ полностью скопирован с https://unix.stackexchange.com/a/414408/176227

1
user8874182user8874182 3 Янв 2018 в 02:08

Вы хотите вставить две строки в начало существующего файла.

Нет универсального способа сделать это. Вы можете добавлять данные в конец существующего файла, но нет другого способа вставить данные, кроме как в конец, по крайней мере, не без перезаписи части файла после точки вставки.

После создания файла вы можете перезаписать данные в нем, но положение любых немодифицированных данных останется прежним.

Когда вы используете текстовый редактор для редактирования файла, он выполняет обновления в памяти; когда вы сохраняете файл, он может создать новый файл с тем же именем, что и старый, или он может создать временный файл и затем переименовать его. в любом случае он должен записать все содержимое, а исходный файл будет затерт (хотя некоторые редакторы могут создавать резервную копию).

Ваш метод:

cat file1 file2 >> file3
mv file3 file2

В значительной степени способ сделать это (за исключением того, что >> должен быть >; вы не хотите сохранять предыдущее содержимое file3, если оно уже существует).

Вы можете использовать временное имя файла:

cat file1 file2 > tmp$$ && mv tmp$$ file2

tmp$$ использует идентификатор текущего процесса оболочки для генерации имени файла, которое почти наверняка будет уникальным (так что вы ничего не сбиваете). && означает, что команда mv не будет выполнена, если команда cat не удалась, поэтому вы все равно будете иметь исходный file2 в случае ошибки.

0
Keith Thompson 3 Янв 2018 в 01:44