Почему эта конструкция sed ничего не вставляет в пустой файл?

Заголовок в строке состояния был изменен escape-последовательностью из хоста «build». Простое завершение соединения ssh не меняет название обратно.

Отправка "\ekTEST\e\\"на терминал изменит заголовок на "ТЕСТ". Это обратная косая черта ESC k TEST ESC.

echo -en "\ekTEST\e\\"

С практической точки зрения это тоже сработает

echo -e "\ekTEST"
1
25.07.2020, 18:20
2 ответа

Sed работает с каждой строкой файла, но если в файле нет ни одной строки, sed не работает. Как это часто бывает, awk обеспечивает большую гибкость.

Попробуйте GNUawk:

gawk -i inplace 'BEGINFILE{print"hello world"} 1' foo

Описанное выше будет работать независимо от того, пусто fooили нет.

Если у вас нет GNU awk(gawk), вам нужно:

awk 'BEGIN{print"hello world"} 1' foo >tmp && mv tmp foo

Как это работает

Перед запуском любого файла в командной строке BEGINFILE{print"hello world"}пишет hello world. Это происходит независимо от того, пуст файл или нет.

Для каждой строки в файле 1является сокращением awk для печати строки.

Для GNU awk -i inplaceявляется эквивалентом -ised.

4
18.03.2021, 23:17

Если вы действительно хотите использовать sed, вы можете сделать что-то вроде следующего:

$ echo "FPM" >> foo; sed -i -e '1i\hello world' -e '$ d' foo

Это будет работать независимо от того, существует ли fooили нет, пуст он или нет.

Первая команда, echo "FPM" >> foo, добавляет строку "FPM" (может быть любым текстом, который вам нравится )в конец foo, если fooсуществует; в противном случае он создает fooи добавляет строку «FPM» к foo.

Вторая команда, sed -i -e '1i\hello world' -e '$ d' foo, вставляет «hello world» над первой строкой в ​​foo, а затем удаляет последнюю строку файла (, содержащую «FPM» ).

1
18.03.2021, 23:17

Теги

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