Многострочный sed в Makefile

До такого странного поведения я установил строку mda...в конце моего .fetchmailrc, и по какой-то неизвестной мне пока причине это было применено ко всем моим аккаунтам.

Проблема, с которой я столкнулся, заключалась в том, что fetchmail возвращался к своему нормальному поведению. -mda был установлен как последняя строка, поэтому он применялся только к последней учетной записи в файле rc -.

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

6
22.04.2020, 02:31
3 ответа

Попробуйте

$ sed -n -e '/[{]/,/[}]/{p; /[}]/ a\ //end of block matching brace' -e' }' file
{sdfg
If I add backslashes or place everything on one line I get
df }
 //end of block matching brace

Помните о ДВУХ-e(параметрах выражения ), которые необходимы, потому что вам нужно завершить присоединяемый текст. Не все версии sedпозволяют добавлять текст в ту же строку (, что делает мой GNU sed, а мой FreeBSD sed— нет ).

3
19.03.2021, 02:27

С gnu make и оболочкой, которая принимает $''вы можете использовать промежуточную переменную в качестве дескриптора make \eolпо-разному вне рецептов:

make  -f - <<\!
define mycmd
sed -n $$'/[{]/,/[}]/{\n\
p\n\
/[}]/a\\\n\
 //end of block matching brace\n\
}' myfile.txt
endef

.PHONY: default
default:
        $(mycmd)
!

В каждой строке было добавлено \n\, а одиночная \была удвоена. Make преобразует \eolвнешние рецепты в пробел, так что все они заканчиваются на одной строке, затем оболочка $''преобразует \nв настоящие новые строки. Вам не нужно использовать defineдля установки переменной; MYCMD = sed...работает аналогично.

1
19.03.2021, 02:27

Всякий раз, когда я борюсь с новыми строками, обратными косыми чертами, например, в make-файлах, я использую команду Gв sed. Более того, он позволяет оставаться в рамках Posix sed :

.
$ sed -e '/[{]/,/[}]/!d' -e '/[}]/G' -e 's|\n|&//end of block matching brace|' myfile.xt
2
19.03.2021, 02:27

Теги

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