Команда 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
Это немного неудобно для командной строки, но является хорошей мерой предосторожности в любом сценарии, который должен записывать во временный файл.
Да, но вы должны использовать здесь-строку , а не здесь-документ:
cat >"$HOME/myRep/tiesto" <<<'tiesto'
Это отправит строку tiesto
на cat
на своем стандартном вводе, и он запишет строку в файл $HOME/myRep/tiesto
через перенаправление своего стандартного вывода.
Обратите внимание, что здесь-строки не являются стандартными, а реализованы по крайней мере zsh
(откуда они берутся, в то же время, что и UNIX-версия rc
, хотя это rc
и его производные, такие как es
или akanga
не добавляют дополнительный символ новой строки в конце), ksh93
, bash
, мкш
и яш
.
Вы можете поместить здесь -документ (вместо здесь -строки )в одной строке, используя:
eval $'cat << TEST > ~/myRep/tiesto\ntiesto\nTEST'
Технически это одна строка кода, но $'...'
будет преобразован в новый 3-строчный код, который снова eval
унифицирован.
Используя eval
, вы всегда можете поместить любой шелл-код в одну строку.
С оболочками, которые не поддерживают $'...'
, можно сделать:
eval "$(printf 'NL="\n"')"; eval "cat << TEST > ~/myRep/tiesto${NL}tiesto${NL}TEST"
или
eval "$(printf 'cat << TEST > ~/myRep/tiesto\ntiesto\nTEST')"
Конечно здесь,
echo tiesto > ~/myRep/tiesto
было бы намного проще. Или для нескольких строк:
printf '%s\n' "line 1" "line 2" > ~/myRep/tiesto