grep只发生一次

时间:2016-03-15 20:17:45

标签: linux shell unix grep

我正在尝试抓取一些内容,但在同一行中有多个实例。我正在使用此命令。

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

4 个答案:

答案 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