计算包含模式的行数

时间:2013-11-10 12:13:58

标签: regex linux sed

我的数据如下:

<id_mytextadded1829>
<text1>    <text2>    <text3>.
<id_m_abcdef829>
<text4>    <text5>    <text6>.
<id_mytextadded1829>
<text7>    <text2>    <text8>.
<id_mytextadded1829>
<text2>    <text1>    <text9>.
<id_m_abcdef829>
<text11>    <text12>    <text2>.

现在我想要<text2>所在的行数。我知道我可以使用python的正则表达式做同样的事情。但是正则表达式会告诉我一个模式是否存在于某一行中?另一方面,我的要求是找到一个恰好位于一行中间的字符串。我知道sed很适合替换一行中的内容。但是,如果我只想要行数,则可以使用sed来替换。

编辑: 对不起,我忘了提。我想要在行的中间出现<text2>的行。我不想要在行的开头或结尾出现<text2>的行。 例如。在上面显示的数据中,中间有<text2>的行数是2(而不是4)。

我是否有某种方法可以达到所需的行数,通过这些行可以找到使用linux或python中间<text2>的行数

5 个答案:

答案 0 :(得分:3)

  

我想要在行的中间出现<text2>的行。

你可以说:

grep -P '.+<text2>.+' filename

列出包含<text2>的行不在行的开头或结尾。

为了只得到比赛次数,你可以说:

grep -cP '.+<text2>.+' filename

答案 1 :(得分:1)

您可以使用grep。例如,这将计算文件中与^123[a-z]+$模式匹配的行数:

egrep -c ^123[a-z]+$ file.txt

P.S。我不太确定语法,我现在没有可能测试它。也许应引用正则表达式。

编辑:这个问题有点棘手,因为我们不确定你的数据是什么 以及你究竟想要在其中计算什么,但是这一切都归结为正确制定正则表达式。

如果我们假设<text2>是一个确切的字符序列,应该出现在行的中间,并且不应该出现在开头和结尾,那么这应该是你的正则表达式寻找:^<text[^2]>.*text2.*<text[^2]>\.$

答案 2 :(得分:0)

  

我想要在行的中间出现的行。我不   想要在开头或结尾出现的行   线。

尝试将grep-c

一起使用
grep -c '>.*<text2>.*<' file

输出:

2

答案 3 :(得分:0)

使用awk即可:

awk '$2~/text2/ {a++} END {print a}' file
2

它将计算行中间text2的所有行。

答案 4 :(得分:0)

哪里发生(无处不在)

sed -n "/<text2>/ =" filename

如果你想在中间(比如稍后在评论中写)

sed -n "/[^ ] \{1,\}<text2> \{1,\}[^ ]/ =" filename