我有一個變量,其中包含以字符串_NEWLINE_
分隔的文件列表。我需要將該變量輸出到一個文件中,以便每個文件位於不同的行中。訣竅是它需要在FreeBSD和Solaris上工作。如何在GNU makefile中將文件分割成單獨的行
這是我現在想:
echo "lib/alarms-1.2/priv/snmp_conf/agent.conf: lib/alarms/priv/snmp_conf/agent.conf_NEWLINE_lib/alarms-1.2/priv/snmp_conf/agent.conf.src: lib/alarms/priv/snmp_conf/agent.conf.src_NEWLINE_lib/alarms-1.2/priv/snmp_conf/community.conf: lib/alarms/priv/snmp_conf/community.conf" | sed 's|_NEWLINE_|\'$'\n|g'
這個工程在FreeBSD和Solaris上殼。但在GNUmakefile運行在Solaris上我得到這個(在每一行結束通知$):
lib/alarms-1.2/priv/snmp_conf/agent.conf: lib/alarms/priv/snmp_conf/agent.conf$
lib/alarms-1.2/priv/snmp_conf/agent.conf.src: lib/alarms/priv/snmp_conf/agent.conf.src$
lib/alarms-1.2/priv/snmp_conf/community.conf: lib/alarms/priv/snmp_conf/community.conf$
如果我從SED刪除\'$'
然後它工作在Solaris上,但沒有在FreeBSD。也許有一種方法告訴哪個版本的使用取決於哪個系統的makefile被執行?
編輯: 感謝我創建了一個提供所需的結果,似乎是工作在兩個FreeBSD和Solaris上示範的makefile bobbogo提出解決方案:
one-line := lib/alarms-1.2/priv/snmp_conf/agent.conf: lib/alarms/priv/snmp_conf/agent.conf_NEWLINE_lib/alarms-1.2/\
priv/snmp_conf/agent.conf.src: lib/alarms/priv/snmp_conf/agent.conf.src_NEWLINE_lib/alarms-1.2/priv/snmp_conf/comm\
unity.conf: lib/alarms/priv/snmp_conf/community.conf
many-lines := { echo '$(subst _NEWLINE_,' && echo ',${one-line})'; }
.PHONY: all
all:
$(shell $(many-lines) > test.txt)
在閱讀接受的答案後,在我看來,上面最初的'sed'方法是一種更簡單的方法(參見@ Beta的答案)。儘管使用perl。 perl是其中最具可移植性的語言之一,它總是勝過grep/sed/awk et。人。 'echo'$ {one-line}'| perl -lpe的/ _NEWLINE _/\ n/g''也許。 (或者perl -lpe BEGIN {$$/=「_NEWLINE_」}「-timtowtdi,就像Perl的人說的那樣)。 – bobbogo