我正在尝试抓取一些内容,但在同一行中有多个实例。我正在使用此命令。
grep -o -m 1 -P '(?<=sk).*(?=fa)' test.txt | head -1
然而,搜索在第二场/最后一场比赛后结束。在Ubuntu 14.04.2上运行它
test.txt: skjahfasdkl aklsdj laks skjahfasdkl aklsdj laks
Current Output: jahfasdkl aklsdj laks skjah
Desired output: jah
答案 0 :(得分:1)
你只需要非贪心:
grep -m1 -oP '(?<=sk).*?(?=fa)' file | head -1
# ...................^^^
-m1
将在第一个行之后停止,但您仍然需要head
来限制第一个匹配。
答案 1 :(得分:0)
这是贪婪的匹配,您希望将空格视为分隔符,因此请指定与非空间字符的匹配,即
... '(?<=sk)[^ ]*(?=fa)'
答案 2 :(得分:0)
如果条件是sk和fa之间的非空格(在单词中匹配),则可以使用[^] *代替。*,如下所示:
grep -o -m 1 -P '(?<=sk)[^ ]*(?=fa)' test.txt | head -1
否则你可以使用它:
sed -e "s/sk\(.*\)fa.*$/\1/g" test.txt | sed -e "s/fa.*$//g"
测试:
echo "skjahz z zfasdkl aklsdj laks skjahppppfasdkl aklsdj laks" | sed -e "s/sk\(.*\)fa.*$/\1/g" | sed -e "s/fa.*$//g"
#jahz z z
答案 3 :(得分:0)
如果你考虑非grep的答案,那么这个gnu-awk可以完成这项工作:
awk -v FPAT='sk[^[:blank:]]*fa' '{gsub(/^sk|fa$/, "", $1); print $1; exit}' file