MAWK:将 match() 存储在变量中
MAWK: Store match() in variable
我尝试使用 MAWK,其中 match()
内置函数没有变量的第三个值:
match(, /9f7fde/) {
substr(, RSTART, RLENGTH);
}
见doc。
如何将此输出存储到名为 var
的变量中,以便稍后我想像这样构建输出?
EDIT2 - 完整示例:
输入文件结构:
<iframe src="https://vimeo.com/191081157" frameborder="0" height="481" width="608" scrolling="no"></iframe>|Random title|Uploader|fun|tag1,tag2,tag3
<iframe src="https://vimeo.com/212192268" frameborder="0" height="481" width="608" scrolling="no"></iframe>|Random title|Uploader|fun|tag1,tag2,tag3
parser.awk:
{
Embed = ;
Title = ;
User = ;
Categories = ;
Tags = ;
}
BEGIN {
FS="|";
}
# Regexp without pattern matching for testing purposes
match(Embed, /191081157/) {
Id = substr(Embed, RSTART, RLENGTH);
}
{
print Id"\t"Title"\t"User"\t"Categories"\t"Tags;
}
预期输出:
191081157|Random title|Uploader|fun|tag1,tag2,tag3
我想在 match()
函数外调用 Id
变量。
MAWK 版本:
mawk 1.3.4 20160930
Copyright 2008-2015,2016, Thomas E. Dickey
Copyright 1991-1996,2014, Michael D. Brennan
random-funcs: srandom/random
regex-funcs: internal
compiled limits:
sprintf buffer 8192
maximum-integer 2147483647
显而易见的答案似乎是
match(, /9f7fde/) { var = "9f7fde"; }
但更一般的是:
match(, /9f7fde/) { var = substr(, RSTART, RLENGTH); }
更新:我上面的解决方案可以简化为:
来自
match(, /9f7fde/) { var = substr(, RSTART, RLENGTH) }
到
{ __=substr($!_,match($!_,"9f7fde"),RLENGTH) }
失败的匹配会 RLENGTH
自动设置为 -1,因此没有任何子字符串被输出。
但这也太冗长了:因为匹配条件是一个常量字符串,那么简单
mawk '$(_~_)~_{__=_}' \_='9f7fde'
============================================
假设这一行
.....vimeo.com/191081157" frameborder="0" height="481" width="608" scrolling="no">Random title|Uploader|fun|tag1,tag2,标签 3
{mawk/mawk2/gawk} 'BEGIN { OFS = "";
FS = "(^.+vimeo[6]com[7]|[2] frameborder.+[7]iframe[>])" ;
} (NF < 4) || ( !~ /191081157/) { next } ( = )'
\056 是点 (.) \057 是正斜杠 (/),\042 是双直引号 (")
如果根本无法匹配,请转到下一行。否则,使用字段分隔符的力量吞噬掉行中所有不需要的部分。 $1 = $1 将收集前缀和您不需要的其余 HTML 标签。
$1 = $1 的赋值操作也将 return 为真,为布尔值计算提供输入以供其打印。这样,您根本不需要 match( ) 或 substr( )。
我尝试使用 MAWK,其中 match()
内置函数没有变量的第三个值:
match(, /9f7fde/) {
substr(, RSTART, RLENGTH);
}
见doc。
如何将此输出存储到名为 var
的变量中,以便稍后我想像这样构建输出?
EDIT2 - 完整示例:
输入文件结构:
<iframe src="https://vimeo.com/191081157" frameborder="0" height="481" width="608" scrolling="no"></iframe>|Random title|Uploader|fun|tag1,tag2,tag3
<iframe src="https://vimeo.com/212192268" frameborder="0" height="481" width="608" scrolling="no"></iframe>|Random title|Uploader|fun|tag1,tag2,tag3
parser.awk:
{
Embed = ;
Title = ;
User = ;
Categories = ;
Tags = ;
}
BEGIN {
FS="|";
}
# Regexp without pattern matching for testing purposes
match(Embed, /191081157/) {
Id = substr(Embed, RSTART, RLENGTH);
}
{
print Id"\t"Title"\t"User"\t"Categories"\t"Tags;
}
预期输出:
191081157|Random title|Uploader|fun|tag1,tag2,tag3
我想在 match()
函数外调用 Id
变量。
MAWK 版本:
mawk 1.3.4 20160930
Copyright 2008-2015,2016, Thomas E. Dickey
Copyright 1991-1996,2014, Michael D. Brennan
random-funcs: srandom/random
regex-funcs: internal
compiled limits:
sprintf buffer 8192
maximum-integer 2147483647
显而易见的答案似乎是
match(, /9f7fde/) { var = "9f7fde"; }
但更一般的是:
match(, /9f7fde/) { var = substr(, RSTART, RLENGTH); }
更新:我上面的解决方案可以简化为:
来自
match(, /9f7fde/) { var = substr(, RSTART, RLENGTH) }
到
{ __=substr($!_,match($!_,"9f7fde"),RLENGTH) }
失败的匹配会 RLENGTH
自动设置为 -1,因此没有任何子字符串被输出。
但这也太冗长了:因为匹配条件是一个常量字符串,那么简单
mawk '$(_~_)~_{__=_}' \_='9f7fde'
============================================
假设这一行
.....vimeo.com/191081157" frameborder="0" height="481" width="608" scrolling="no">Random title|Uploader|fun|tag1,tag2,标签 3
{mawk/mawk2/gawk} 'BEGIN { OFS = "";
FS = "(^.+vimeo[6]com[7]|[2] frameborder.+[7]iframe[>])" ;
} (NF < 4) || ( !~ /191081157/) { next } ( = )'
\056 是点 (.) \057 是正斜杠 (/),\042 是双直引号 (")
如果根本无法匹配,请转到下一行。否则,使用字段分隔符的力量吞噬掉行中所有不需要的部分。 $1 = $1 将收集前缀和您不需要的其余 HTML 标签。
$1 = $1 的赋值操作也将 return 为真,为布尔值计算提供输入以供其打印。这样,您根本不需要 match( ) 或 substr( )。