我有一个名为animals
的文件,其中包含以下条目:
$ cat animals
name: elephant
class: mammal
habitat: India
name: Baltic herring
class: fish
habitat: Baltic sea
name: wolf
class: mammal
habitat: Sweden
name: eagle
class: bird
habitat: USA
$
如上所示,此文件包含四个部分。我想打印出那些包含字符串mammal
的部分,我想在bash中执行此操作,即不使用sed
或awk
。我是这样做的:
$ cat animals | while read -r line; do
> if [[ "$line" =~ ^name ]]; then
> section="$line"
> while read -r line2; do
> if [[ "$line2" =~ ^$ ]]; then
> break
> else
> section+=$'\n'"$line2"
> fi
> done
> echo "$section" | grep -q mamm && echo "$section"$'\n' ; section=
> fi
> done
name: elephant
class: mammal
habitat: India
name: wolf
class: mammal
habitat: Sweden
$
然而,在bash中实现这一点是否有更优雅(更短且不那么繁琐)的方式?或者这是一个应该考虑像awk
这样的工具的点?
答案 0 :(得分:1)
如何简单,
grep mammal -C 1 --group-separator="" animals
答案 1 :(得分:1)
是的,你应该看看awk。它允许您更简单地执行此操作:
awk -v RS= -v ORS='\n\n' '/mammal/' file
这会取消记录分隔符,以便将每个块视为单个记录。然后打印每个匹配“哺乳动物”模式的记录,然后打印两个换行符,产生与问题中显示的输出相同的输出。