Makefile 中的多行 sed

Makefile 中的多行 sed

我有一个sed要在Makefile.它在终端中工作。命令是

sed -n '/[{]/,/[}]/{
p
/[}]/a\
 //end of block matching brace
}' myfile.txt

这会导致以下错误消息make

/bin/sh: 2: Syntax error: Unterminated quoted string

如果我添加反斜杠或将所有内容放在一行上,我会得到

sed: -e expression #1, char 14: extra characters after command

任何帮助将不胜感激。

答案1

尝试

$ 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版本都允许在同一行中附加文本(我的 GNUsed允许,我的 FreeBSDsed不允许)。

答案2

每当我在 makefile 中遇到换行符、反斜杠(尤其是)问题时,我都会使用Gsed 中的命令。更重要的是,它允许人们保留在 Posix sed 中:

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

答案3

使用 gnu make 和接受的 shell,$''您可以使用中间变量,因为 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外部配方转换为空格,因此所有内容最终都在一行上,然后 shell$''将其转换\n为真正的换行符。您不必使用define来设置变量;MYCMD = sed...工作原理类似。

相关内容