2017-01-06 29 views
-1

如何強制m4繼續處理行如果值有散列?m4停止處理,如果新值包含散列(#)

$ echo a a a | m4 -D a=B+ 
B+ B+ B+ 
$ echo a a a | m4 -D a=B# 
B# a a 

我想對第二種情況相同的行爲 - 是否有可能? (全部三次被替換)。

在我的理解中觀察到的行爲是不一致的,我在用戶手冊中找不到解釋。

+1

m4不是標籤系統。該字符被稱爲「散列」。 – melpomene

回答

4

#字符是註釋的第一個字符,換行符是最後一個字符。 m4解析第一個a並將其替換爲B#。它不會掃描更多,因爲它會發表評論。

的解決方案是與changecom改變註釋字符:

$ echo "changecom(BC,EC)a a a" | m4 -D a=B# 
B# B# B# 

當然,你可以選擇更好的評論開始時間和結束序列。

Ps。您可以通過簡單的changecom關閉評論,無需參數:echo changecom a a a。您可以從手冊中閱讀:)

+0

非常感謝。我現在解決了這個問題,但它看起來仍然不一致。如果價值(我從第三方獲取)將包含另一個changecom()?到目前爲止,我正在'堆棧溢出':echo「changecom(BC,EC)a a」| m4 -D'a = B#changecom(a)'。儘管我會接受答案,但我仍然不明白當前的方法以及如何處理它。 – noonex

+0

我認爲概念上的評論必須在處理之前剝離出來,但無論如何它看起來存在邊界案例問題,並且該工具可能對變通解決方案有用 – noonex

+0

這不是不一致的行爲,它有很好的記錄。 'm4'解析其輸入並搜索已知關鍵字(和宏)並將其「替換」爲其定義。如果你想包含一個文件並且不想分析,你可以使用'paste'。或者如果它有幫助,你可以使用'-P'選項來'm4'。或者...如果你想使用一個工具,你應該知道它:) – uzsolt