我有一个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 中遇到换行符、反斜杠(尤其是)问题时,我都会使用G
sed 中的命令。更重要的是,它允许人们保留在 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...
工作原理类似。