Это не команда sed
внутри sed
, это просто замена, которую ваша оболочка делает перед вызовом sed
. Просто используйте правильные кавычки и круглые скобки, и все готово:
sed -i.bak -e "$(sed -n 1,1p file.txt),\$d" output.file
Двойные кавычки позволяют выполнять замену внутри процесса (одинарные кавычки - нет), а синтаксис $ ()
означает, что результатом внутренней команды является захватили и подставили. Обратите внимание, что \ $
нужно было экранировать, чтобы предотвратить интерпретацию $ d
как переменной.
Менее запутанный способ записать то же самое было бы
n=$(sed -n 1,1p file.txt)
sed -i.bak -e "${n}\$d" output.file
Вы также можете написать это как "$ {n}" ', $ d'
, в bash
вы может объединять строки с разными кавычками (включая строки без кавычек), просто помещая их одну рядом с другой.
Также вы можете написать sed -n '1 {p; q}' file.txt
. Прежде всего, вам не нужно писать диапазон, если вы указываете только один номер строки. Во-вторых, если вы завершите работу после печати первой строки ( q
), он не прочитает весь файл без причины - более эффективно. Поскольку это первая строка, -n
также можно опустить. Или вы можете использовать head -n1 file.txt
.