恐怕正则表达式在这里不会对您有太大帮助,因为您输入的不规则性质(可以匹配它,但是以一种或另一种方式安排所有内容将是一种负担)。这可以用任何编程语言很容易地完成,但是对于这样的东西,我总是去awk。
假设您的输入位于名为 的文件中input.txt
,请将以下内容放入名为 的程序中parse.awk
:
BEGIN {
FS=" *, *";
formatStr = "%32s,%8s,%8s,%8s,%10s,%16s,%8s,%18s,%10s,%10s,%16s,%16s\n";
printf( formatStr, "id", "sight", "value", "zoom", "recoil", "spread_moving", "extra", "upper_receiver", "barrel", "damage", "spread_moving", "concealment" );
}
{
split("",a);
for( i=2; i<=NF; i++ ) {
if( split( $(i), kvp, " *= *" ) == 1 ) {
a[kvp[1]] = "x";
} else {
a[kvp[1]] = gensub( /^\s*|\s*$/, "", "g", kvp[2] );
}
}
printf( formatStr, $1, a["sight"], a["value"], a["zoom"], a["recoil"],
a["spread_moving"], a["extra"], a["upper_receiver"],
a["barrel"], a["damage"], a["spread_moving"], a["concealment"] );
}
对它运行 awk:
awk -f parse.awk input.txt
并得到你的输出:
id, sight, value, zoom, recoil, spread_moving, extra, upper_receiver, barrel, damage, spread_moving, concealment
bm_wp_upg_o_t1micro, x, 3, 3, 1, -1, , , , , -1,
bm_wp_upg_o_marksmansight_rear, x, 3, 1, 1, , , , , , ,
bm_wp_upg_o_marksmansight_front, , 1, , , , x, , , , ,
bm_wp_m4_upper_reciever_edge, , 3, , 1, , , , , , ,
bm_wp_m4_upper_reciever_round, , 1, , , , , , , , ,
bm_wp_m4_uupg_b_long, , 4, , , -2, , , x, 1, -2, -2
请注意,我选择只使用“x”来表示视线,这似乎是一个存在/不存在的东西。你可以在那里使用任何你想要的东西。
如果您使用的是 Linux 或 Macintosh,则应该有可用的 awk。如果您使用的是 Windows,则必须安装它。