如何在Makefile(POSIX)中使用的sed命令中保持换行符完整?

孤独的学习者

注意:这不是“是否可以在Makefile中创建多行字符串变量”和其他类似问题的副本这个问题要求不依赖纯Bash或仅GNU Make的功能的POSIX兼容解决方案。关于堆栈溢出的另一个问题没有此要求。

sed在macOS High Sierra上使用BSD获取以下shell脚本

printf 'foo\nbaz\n' | sed '/foo/a\
bar
'

输出为:

foo
bar
baz

我怎样才能把同样的东西放进去Makefile这是我尝试过的方法,但似乎不起作用:

all:
    printf 'foo\nbaz\n' | sed '/foo/a\\
    bar\
    '

这会导致错误:

$ make
printf 'foo\nbaz\n' | sed '/foo/a\\
/bin/sh: -c: line 0: unexpected EOF while looking for matching `''
/bin/sh: -c: line 1: syntax error: unexpected end of file
make: *** [all] Error 2

我如何才能sed在Makefile中正确编写上述调用,以便在make执行all目标时将尾部斜杠和换行符正确地输入到shell中?

注意:我希望Makefile兼容POSIX,并且仅使用http://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html中的功能

苏珊·帕尔(Susam Pal)

带有后缀的参数扩展 sed

这是一个将变量<newline>x(即换行符后跟字符x)放入变量,然后在sed命令中使用此变量的解决方案在使用此变量时,我们使用shell参数扩展来消除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简化参数扩展

我们可以使用makemacros简化先前解决方案的使用我们将所有笨拙的部分放入宏中。然后,在shell命令中扩展这些宏。这是一个例子:

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

这是类似线路上的另一种可能的解决方案。代替书写的unwiedly语法${NX%x}内的sed命令两次,它通过分配简化${NX%x}本身到另一个名为shell变量NL${NL}来代替在sed命令。

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

简化参数扩展之前sedmake

可以通过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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Gnu sed中使用a和i命令使用\ n添加换行符?

Bash-如何在sed命令输出中保留换行符?

如何在Jsoup中保持换行符?

在Linux命令中使用换行符

如何在苗条变量中使用换行符?

如何在Text Widget Flutter中使用换行符

如何在localStorage中使用换行符?

如何在Django模板中使用换行符

如何在Python中使用换行符?

如何在带空格的变量中使用换行符

角ng内容正在丢失换行符。如何保持换行符完整?

在提示字符串中使用变量时如何在read -p命令中使用换行符

如何在列表元素中保留换行符\ n?

使用gocolly抓取时如何在html表格单元格中保留换行符

防止在cut命令中使用换行符

在bash命令替换中使用换行符进行拆分

如何在group_concat函数MYSQL中使用换行符作为分隔符?

如何在使用“文本/纯文本”进行粘贴时保持换行符?

如何在AngularJS中使textarea不允许或忽略换行符/换行符/返回

如何在脚本中将换行符传递给命令?

对jQuery使用.text()方法时如何保持换行符?

如何使sed(使用bash)在换行符处停止?

如何使用sed替换换行符(\ n)?

如何在UITableView的页脚标题中使用换行符?

如何在C ++中使用自动换行符实现日志记录宏

如何在换行符中使用python -c“在此编码”?

如何在文本/纯servlet响应中使用换行符

如何在Google Apps脚本的警报/提示对话框中使用换行符?

如何在Django模板中使用换行符从数据库输出文本?