SED - Вставить файл поверх другого

Предполагая, что env находится в вашем пути:

env kill -p http

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

Это создает некоторые элементы управления заданиями оболочки, но не полагается на внешнюю команду:

exec kill -p bash &

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

5
14.01.2017, 23:09
3 ответа

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

Однако вы можете просто использовать старый добрый кот . В конце концов, это команда для объединения файлов:

$ cat file1.txt file2.txt >out && mv out file2.txt

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

$ tmp="$(mktemp)" && cat file1.txt file2.txt >"$tmp" && mv "$tmp" file2.txt

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

6
27.01.2020, 20:32

Если вы полны решимости избегать доступа cat к явному временному файлу (или через буфер, например sponge ), то похоже, что ed по крайней мере примет 0-адрес для своей команды r :

ed -s file2.txt << EOF
0r file1.txt
wq
EOF

или эквивалентно

printf '0r file1.txt\nwq\n' | ed -s file2.txt
4
27.01.2020, 20:32

С помощью команды N

При условии, что file2.txt имеет более одной строки (иначе см. другой раздел):

sed -i -e '1 { r file1.txt' -e 'N; }' file2.txt

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

Из руководства:

N

Добавьте следующую строку ввода в пробел шаблона.

С помощью команды e

При условии, что file2.txt не пуст (иначе просто сделайте копию):

sed -i -e '1 e cat file1.txt' file2.txt

GNU sed предоставляет команду e, которая выполняет команду в параметре. Результат выводится немедленно.

Из руководства:

e [COMMAND]

Эта команда позволяет передавать ввод от команды оболочки в пространство шаблона. Без параметров команда `e' выполняет команду команду, которая находится в пространстве шаблона, и заменяет пространство шаблона и заменяет пространство шаблона на выходной файл; при этом новая строка в конце подавляется.

Если указан параметр, то команда `e' интерпретирует его как команду и отправляет на вывод. как команду и посылает ее вывод в поток вывода.

Обратите внимание, что, в отличие от команды 'r', вывод команды будет будет напечатан немедленно; команда 'r' вместо этого откладывает вывод до конца текущего цикла.

7
27.01.2020, 20:32

Теги

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