我必须算上所有' ='在两种模式之间,即{'和'}' 样品:
{
100="1";
101="2";
102="3";
};
{
104="1,2,3";
};
{
105="1,2,3";
};
预期产出:
3
1
1
答案 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; }'