【问题标题】:make: referencing shell variables in sed callmake:在 sed 调用中引用 shell 变量
【发布时间】:2011-07-28 02:24:46
【问题描述】:

我正在使用 make,我想在 sed 中引用一个 shell 变量。但是,在sed-call 中,$$LASTMOD 只扩展为$LASTMOD,但我希望看到类似的东西

-rw-r--r--    1 weiss    Administ     5752 Apr  1 23:44 src/stata/ini-00.do

它适用于echo,但不适用于sed.ONESHELL 似乎也不起作用。

.SUFFIXES : .do .tmp

DOFILES = $(shell ls src/stata/*.do | sed 's/.do/.tmp/')

all: $(DOFILES)

.do.tmp: 
    LASTMOD=`ls -l $*`; echo $$LASTMOD; sed -e \
    "s/Last modified:.*/Last modified: $$LASTMOD/g" $*.do > $*.tmp 

更新:

按照@geekosaur、@William Pursell 和@eriktous 的建议应用更改后,它就像一个魅力:

.SUFFIXES : .do .tmp

DOFILES = $(shell ls src/stata/*.do | sed 's/\.do/\.tmp/')

all: $(DOFILES)

.do.tmp: 
    LASTMOD=`ls -l $<`; \
    sed -e "s, Last modified:.*, Last modified: $$LASTMOD, g" $*.do > $*.tmp

【问题讨论】:

  • DOFILES 程序集中的 sed 脚本可能不是您想要的,尽管它现在可能对您有用。 .do 中的 . 被解释为特殊字符。这将更改 d.tmp.do 中名为 dodo.do 的文件。
  • 你说得对,谢谢...也改了。

标签: shell variables sed makefile


【解决方案1】:

你真的在那里使用双引号吗?我希望单引号的行为;但是如果使用双引号,您将收到 sed 语法错误,除非您转义斜杠或使用不同的模式分隔符(当我知道会涉及到 / 时,我通常使用 ,,就像路径名一样)。

LASTMOD=$$(ls -l "$*"); \
sed "s,Last modified:.*,Last modified: $$LASTMOD,g" "$*.do" >"$*.tmp"

【讨论】:

  • 谢谢,但这也不起作用(LASTMOD=$$(ls -l "$*") 不会被解释为 Bash 变量)。
  • 请接受我的道歉,但你是对的。正如@William Pursell 所指出的,由于错误指定了LASTMOD-variable,它不起作用。
【解决方案2】:

你是说ls -l $*,还是写ls -l $&lt;?你在做什么看起来是正确的,除了那个。 (Make 会在不扩展 $LASTMOD 的情况下回显命令,但 sed 会执行您想要的替换。)

【讨论】:

  • 啊,你是对的!这是 $, 而不是 / 也是正确的。我绝对需要两个答案来解决我的问题...
猜你喜欢
  • 2013-04-02
  • 2017-03-26
  • 2016-10-06
  • 2014-01-09
  • 1970-01-01
  • 2010-10-20
  • 2014-01-28
  • 1970-01-01
  • 2011-10-23
相关资源
最近更新 更多