在Linux中计算两个模式之间的模式总数(如果可能,使用sed)

时间:2016-01-01 22:36:59

标签: linux shell unix sed wc

我必须算上所有' ='在两种模式之间,即{'和'}' 样品:

{
100="1";
101="2";
102="3";
}; 
{
104="1,2,3";
};
{
105="1,2,3";
};

预期产出:

3
1
1

4 个答案:

答案 0 :(得分:1)

Perl救援:

perl -lne '$c = 0; $c += ("$1" =~ tr/=//) while /\{(.*?)\}/g; print $c' < input
  • -n逐行读取输入行
  • -l为每个print
  • 添加换行符
  • /\{(.*?)\}/g是正则表达式。 ?使星号节俭,即匹配最短的字符串。
  • (...)个括号创建一个捕获组,称为$1
  • tr通常用于音译(即将一个字符替换为另一个字符),但这里只计算等号的数量。
  • +=将号码添加到$c

答案 1 :(得分:1)

一个非常神秘的perl答案:

perl -nE 's/\{(.*?)\}/ say ($1 =~ tr{=}{=}) /ge'

tr函数返回音译的字符数。

根据新要求,我们可以进行一些小改动:

perl -0777 -nE 's/\{(.*?)\}/ say ($1 =~ tr{=}{=}) /ges'
  • -0777将整个文件/流读取为单个字符串
  • s函数的s///标志允许.处理像普通字符这样的换行符。

答案 2 :(得分:0)

Awk也在这里

grep -o '{[^}]\+}'|awk -v FS='=' '{print NF-1}'

例如

echo '{100="1";101="2";102="3";}; 
{104="1,2,3";};
{105="1,2,3";};'|grep -o '{[^}]\+}'|awk -v FS='=' '{print NF-1}'

输出

3
1
1

答案 3 :(得分:0)

首先是一些测试输入(a在大括号外面和内容中有一行,一个没有括号,一个只有两个括号)

echo '== {100="1";101="2";102="3=3=3=3";} =; 
a=b
{c=d}
{}'

处理没有括号的行(放置一个虚拟字符,这样你就不会得到一个空字符串)

sed -e 's/^[^{]*$/x/' 

处理没有等号的行(放置一个虚拟字符,这样你就不会得到一个空字符串)

sed -e 's/{[^=]*}/x/' 

删除括号内的内容

sed -e 's/.*{\(.*\)}/\1/'

删除双引号内的内容(不要在那里计算字段)

sed -e 's/"[^"]*"//g' 

使用@repzero方法计算等号

awk -F "=" '{print NF-1}'

结合东西

echo -e '{100="1";101="2";102="3";};\na=b\n{c=d}\n{}' | 
   sed -e 's/^[^{]*$/x/' -e 's/{[^=]*}/x/' -e 's/.*{\(.*\)}/\1/' -e 's/"[^"]*"//g' | 
   awk -F "=" '{print NF-1}'

丑陋的临时字段x和替换{}可以在awk中解决:

echo -e '= {100="1";101="2=2=2=2";102="3";};\na=b\n{c=d}\n{}' | 
   sed -e 's/^[^{]*$//' -e 's/.*{\(.*\)}/\1/' -e 's/"[^"]*"//g' | 
   awk -F "=" '{if (NF>0) c=NF-1; else c=0; print c}'

或更短

echo -e '= {100="1";101="2=2=2=2";102="3";};\na=b\n{c=d}\n{}' |
   sed -e 's/^[^{]*$//' -e 's/.*{\(.*\)}/\1/' -e 's/"[^"]*"//g' |
   awk -F "=" '{print (NF>0) ? NF-1 : 0; }'