1

我有以下形式的数据:

<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)。

有什么方法可以让我获得所需的行数计数,通过它我可以<text2>使用 linux 或 python 找出中间的行数

4

5 回答 5

3

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

你可以说:

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

列出<text2>不在行首或行尾的行。

为了只获得匹配数,您可以说:

grep -cP '.+<text2>.+' filename
于 2013-11-10T12:26:11.493 回答
1

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

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

PS我不太确定语法,目前我没有可能对其进行测试。也许应该引用正则表达式。

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

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

于 2013-11-10T12:15:45.287 回答
0

我想要出现在行中间的行。我不希望出现在行首或行尾的行。

尝试grep使用-c

grep -c '>.*<text2>.*<' file

输出:

2
于 2013-11-10T12:34:06.260 回答
0

使用awk你可以这样做:

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

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

于 2013-11-10T12:38:12.327 回答
0

哪里发生(无处不在)

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

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

sed -n "/[^ ] \{1,\}<text2> \{1,\}[^ ]/ =" filename
于 2013-11-11T06:19:51.720 回答