我遇到了挑战。我有这样的文字:
characteristic "type"
value "A"
value "B"
value "C"
default-value "B"
exit
characteristic "active"
value "no"
value "yes"
default-value "no"
exit
characteristic "traffic"
value "disabled"
value "enabled"
default-value "enabled"
exit
characteristic "quota"
value "enabled"
default-value "disabled"
exit
characteristic "redirect"
value "disabled"
value "enabled"
default-value "disabled"
exit
我想知道'特征'和'退出'之间的'价值'这个词有多少次。所以,我希望这样的事情:
3
2
2
1
2
我尝试使用 sed 和 grep ,但我无法 sed 让我回复 nth 发生' -n -e“/ ^特征/,/ ^退出/ p”'。我确定 bash 可以在没有很多 do / done 和 if 的情况下完成。
感谢您的帮助。
答案 0 :(得分:2)
我说:
awk '$1 == "characteristic" { ctr = 0 } $1 == "exit" { print ctr } $1 == "value" { ++ctr }' filename
非常简单:
$1 == "characteristic" { ctr = 0 } # Start of a new section: reset counter
$1 == "exit" { print ctr } # end of section: print counter
$1 == "value" { ++ctr } # value line: increase counter
答案 1 :(得分:0)
我决定尝试用GNU sed的e
命令来解决这个问题。
这允许那些熟悉sed内联shell命令的人做一些像计算单词的事情。
我们的想法是将每个部分压缩为一行,并将其传递给grep -ow value | wc -l
以计算“值”一词的出现次数。
命令:sed -f char.sed input-file
sed的char.sed
命令文件是:
:a /exit/{ s/\n/ /g s/-/b/g s/^/echo / s/$/ | grep -ow value | wc -l/ e n } N ba
在N
之前,每行上/exit/
的作用是grep -w value
,此时换行符用空格替换,短划线用b替换(因此“default-value”不匹配{{1} }})。然后整行以echo
为前缀,后缀为| grep -ow value | wc -l
。然后使用e
命令执行构造的命令,并将命令的输出粘贴在输出流中。