【发布时间】:2015-10-18 08:00:55
【问题描述】:
所以我有一个文本文件,其中包含一行:
#===== In WORD.BLAH.ETC.WORD.STRING(STUFF) =======
我想要STUFF,我想将它存储在一个变量中。
到目前为止,我可以使用awk '/STRING\(/ { print $0 }' $f 正确获取该行,但我不确定如何提取STUFF。它是如何完成的?我没有 GNU AWK。
【问题讨论】:
所以我有一个文本文件,其中包含一行:
#===== In WORD.BLAH.ETC.WORD.STRING(STUFF) =======
我想要STUFF,我想将它存储在一个变量中。
到目前为止,我可以使用awk '/STRING\(/ { print $0 }' $f 正确获取该行,但我不确定如何提取STUFF。它是如何完成的?我没有 GNU AWK。
【问题讨论】:
求救
awk '/STRING/{match($0, "\\\((.*)\\\)", a); print a[1];}'
或
awk '/STRING/{match($0, /\((.*)\)/, a); print a[1];}'
【讨论】:
awk 'match($0, /STRING\((.*)\)/, a) {print a[1]}'
执行此操作的可靠方法是:
$ awk 'match($0,/STRING\(([^)]*)\)/,a) { print a[1] }' file
STUFF
这将始终只打印 STRING 之后的括号之间的内容,即使在输入行之前或之后还有其他括号,例如:
$ cat file
abc(def) STRING(STUFF) ghi(klm)
$ awk '/STRING/{match($0, /\((.*)\)/, a); print a[1];}' file
def) STRING(STUFF) ghi(klm
$ awk 'match($0, /STRING\((.*)\)/, a) {print a[1]}' file
STUFF) ghi(klm
$ awk -F'[.()]' '$2 == "STRING" {print $3}' file
$
$ awk 'match($0,/STRING\(([^)]*)\)/,a) { print a[1] }' file
STUFF
上面使用 GNU awk 作为第三个参数来 match(),其他 awk 使用 match()+substr()。
【讨论】: