我正在尝试使用 awk match() 和 substr 在匹配发生之前打印所有内容。我在 bash 脚本中使用 awk 从文件名中提取字符串,并尝试了以下操作:
awk 'match($0,".S") {print substr($0, RSTART+1, 3)}'
这给了我 3 个字符,S加上它后面的 2 个字符。
但是,我想要的是在比赛前打印所有内容。
我怎样才能做到这一点?
只是一个小的重新排列:
awk 'match($0, "\.S") {print substr($0, 1, RSTART + 3)}'
这告诉 AWK 从第一个字符开始打印,通过“S”和接下来的两个字符。
要获得相同的结果sed
:
简单版本(“.S”只能出现一次:
sed 's/\(.*\.S..\).*/\1/'
如果 ".S" 可以出现多次,则此版本给出与 AWK 版本相同的结果(仅保留第一个 ".S" 及其后面的两个字符):
sed 's/\.S../&\n/; s/\n.*//'
编辑:
perl -nle 'print "$`$&" if /\.S../'
这应该适合你。
awk '{i = index($0, ".S"); if (i>0) print substr($0, 0, i+5)}'
我宁愿使用:
sed 's/.S.*//'