Расширение параметра с удалением суффикса в sed
Вот решение, которое помещает <newline>x
(т.е. символ новой строки, за которым следует символ x
) в переменную, а затем использует эту переменную в sed
команда.При использовании этой переменной мы используем расширение параметра оболочки , чтобы избавиться от суффикса x
, чтобы у нас остался только символ новой строки.
all:
NX=$$(printf '\nx'); printf 'foo\nbaz\n' | sed "/foo/a\\$${NX%x}bar$${NX%x}"
Значение NX
равно <newline>x
, поэтому ${NX%x}
оценивается как <newline>
.Вот вывод:
$ make
NX=$(printf '\nx'); printf 'foo\nbaz\n' | sed "/foo/a\\${NX%x}bar${NX%x}"
foo
bar
baz
Упрощение расширения параметров в sed
с помощью make
макросов
Мы можем упростить использование предыдущего решения с помощью make
макросов .Мы помещаем все громоздкие части в макросы.Затем мы расширяем эти макросы в командах оболочки.Вот пример:
NX = NX=$$(printf '\nx')
NL = $${NX%x}
all:
$(NX); printf 'foo\nbaz\n' | sed "/foo/a\\$(NL)bar$(NL)"
Вот вывод:
$ make
NX=$(printf '\nx'); printf 'foo\nbaz\n' | sed "/foo/a\\${NX%x}bar${NX%x}"
foo
bar
baz
Расширение параметра с удалением суффикса до sed
Вот еще одно возможное решение для аналогичноголиний.Вместо того чтобы дважды записывать синтаксис ${NX%x}
в команде sed
, это упрощается путем присвоения самого ${NX%x}
другой переменной оболочки с именем NL
, и вместо нее в команде sed
используется ${NL}
.
all:
NX=$$(printf '\nx'); NL=$${NX%x}; printf 'foo\nbaz\n' | sed "/foo/a\\$${NL}bar$${NL}"
Вот вывод:
$ make
NX=$(printf '\nx'); NL=${NX%x}; printf 'foo\nbaz\n' | sed "/foo/a\\${NL}bar${NL}"
foo
bar
baz
Упрощение расширения параметров до sed
с make
Макросами
Использование вышеуказанного решения может быть еще более упрощенос make
макросами следующим образом:
NX = NX=$$(printf '\nx'); NL=$${NX%x}
NL = $${NL}
all:
$(NX); printf 'foo\nbaz\n' | sed "/foo/a\\$(NL)bar$(NL)"
Вот вывод:
$ make
NX=$(printf '\nx'); NL=${NX%x}; printf 'foo\nbaz\n' | sed "/foo/a\\${NL}bar${NL}"
foo
bar
baz