忽略括号内/周围的空格来计算出现次数

时间:2018-06-01 18:02:36

标签: bash awk grep

(对LaTeX用户)我想搜索手动标记的项目

(可能关注的人) script file on GitHub

我试图找到解决方案,但我发现建议首先删除空格。就我而言,我认为应该有更简单的解决方案。它可以使用grepawk或其他工具。

请考虑以下几行:

\item[a)] some text
\item [i) ] any text
\item[ i)] foo and faa
\item [   1) ] foo again

我想找到(或统计)是否有一个)个括号内的项目。格式可以在括号内和/或周围有空格。此外,结束括号前的字符可以是任何字母或数字。

修改:我尝试了grep "\[a)\]",但错过了[ a) ]。 由于有很多可能的方法来编写项目,我无法决定可能的模式。我认为这对我来说已经足够了,比如

\item<blank spaces>[<blank spaces><letter or number>)<blank spaces>]

替换空格无法正常工作,因为上面的模式通常包含文本(例如:\item[ a)] consider the function...

输出应指示是否存在此类模式。它可以是零或出现次数。

3 个答案:

答案 0 :(得分:2)

所以要在grep本身做到这一切:

grep -c -E '\\item\s*\[\s*\w+\)\s*\]' file.txt

注意所有\s*空格检查。同时-c来计算。

打破它:

\\       a backslash (needs escape in grep)
item     "item"
\s*      optional whitespaces
\[       "[" (needs escape in -E)
\s*      optional whitespaces 
\w+      at least one 'word' char
\)       ")" (needs escape in -E)
\s*      optional whitespaces 
\]       "]" (needs escape in -E)

答案 1 :(得分:1)

所以我在想这样的事情:

tr -d " \t" < file.txt | grep -c '\\item\[[0-9A-Za-z])\]'

这会计算你的匹配数量。

编辑:为tr调用添加了\t。现在删除所有空格和标签。

这是一个仅限grep的版本。这对于打印出所有匹配(通过删除-c)也很有用,因为上面的版本修改了输入:

grep -c '\\item *\[ *[0-9A-Za-z]) *\]' file.txt

如果您正在寻找,这是一个更通用的答案。在这里,我们将匹配输出到文件并计算文件中的行以获得匹配数...

grep '\\item *\[ *[0-9A-Za-z]) *\]' file.txt > matches.txt
wc -l < matches.txt

答案 2 :(得分:1)

关注awk也可能有所帮助(我只是删除[]之间的空格,然后在其中查找数字或字符的模式。

awk '
match($0,/\[.*\]/){
  val=substr($0,RSTART+1,RLENGTH-1);
  gsub(/[[:space:]]+/,"",val);
  if(val ~ /[a-z0-9]+\)/){  count++  }
}
END{
  print count
}'  Input_file