隨着GNU AWK:
$ cat tst.awk
/RECORD/ { $0 = gensub(/[^/]+[/]([^/]+)[/]/,"TYPE(\\1)",""); name=tolower($NF) }
{
while (match(tolower($0),"\\<" name "[.][[:alnum:]_.]+")) {
$0 = substr($0,1,RSTART-1) \
gensub(/[.]/,"%","g",substr($0,RSTART,RLENGTH)) \
substr($0,RSTART+RLENGTH)
}
}
{ print }
$ cat file
RECORD /TEST/ tHiS
this.field = 1
THIS.otherfield.sumthin = 2
func = func(%val(ThIs.field,foo.bar,this.other.field))
$ awk -f tst.awk file
TYPE(TEST) tHiS
this%field = 1
THIS%otherfield%sumthin = 2
func = func(%val(ThIs%field,foo.bar,this%other%field))
請注意,我修改你的輸入顯示會隨着this.field
多次出現發生在同一行什麼,並與其他」混合。 「參考文獻(foo.bar
)。我還添加了一些「this」的混合情況,以說明這是如何工作的。
在回答以下關於如何處理包含文件的問題,這裏有一個方法:
這個腳本不僅將擴大所有說「包括子文件」的臺詞,但結果寫入tmp文件,重置ARGV [1](最高級輸入文件)並且不重置ARGV [2](tmp文件),然後讓awk對擴展結果進行任何正常記錄解析,因爲它現在存儲在tmp文件中。如果你不需要,只需執行「打印」標準輸出並刪除任何其他對tmp文件或ARGV [2]的引用。
awk 'function read(file) {
while ((getline < file) > 0) {
if ($1 == "include") {
read($2)
} else {
print > ARGV[2]
}
}
close(file)
}
BEGIN{
read(ARGV[1])
ARGV[1]=""
close(ARGV[2])
}1' a.txt tmp
跑步所給出這3個文件在當前目錄上面的結果:
a.txt b.txt c.txt
----- ----- -----
1 3 5
2 4 6
include b.txt include c.txt
9 7
10 8
將通過10打印數字1,並將其保存在一個名爲「TMP」的文件。
因此,對於這個應用程序,您可以用上面第一個腳本的內容替換上面腳本末尾的數字「1」,它會在tmp文件上工作,該文件現在包含擴展文件的內容。
我認爲是安全的,你應該閱讀相關的STRUCTURE,並根據匹配變量和有效的字段名進行替換。我會使用比sed更高的語言,例如python。順便說一下,STRUCTURE/RECORD是一個擴展,不是標準的f77。 – agentp