如何在两个关键字之间打印行,而文件中的关键字将重复,每个行范围需要存储到单独的变量中?

时间:2014-05-26 16:18:13

标签: bash sed

我有一个名为"动物"其中包含以下两个部分:

$ cat animals 
cat 7
dog 83
tiger 2
lion 23
elephant 1
giraffe 23
hippo 2312
#
cat 23
dog 8
tiger 99
lion 299
elephant 2323
giraffe 4
hippo 5
$ 

我想打印出#34; dog"到大象"分别从两个部分保存第一个输出到第一个变量,第二个输出保存到第二个变量,即第一个命令的所需输出是:

dog 83
tiger 2
lion 23
elephant 1

..并且第二个命令的所需输出是:

dog 8
tiger 99
lion 299
elephant 2323

我不能使用行号,因为有时在" dog"之间会有其他行。线和" elephant"线。我可以像这样轻松地使用sed:

gsed -n '/dog/,/elephant/p' animals

gsed '/dog/,/elephant/!d' animals

..但这会存储两个部分的输出。任何建议,如何在关键字在文件中重复时如何在两个关键字之间打印行,每个行范围应该存储到单独的变量中?

3 个答案:

答案 0 :(得分:0)

您可以捕获所有输出,然后使用参数扩展将其拆分:

all=$( sed -n '/dog/,/elephant/p' animals )
first=${all%
dog*}
shopt -s extglob
second=${all#*elephant +([0-9])
}

echo first
echo "$first"
echo second
echo "$second"

答案 1 :(得分:0)

您可以使用awk

执行此操作
first=$(awk -v n=1 '/dog/ && ++a==n {f=1} f; /elephant/ && f {exit}' file)
second=$(awk -v n=2 '/dog/ && ++a==n {f=1} f; /elephant/ && f {exit}' file)

cat "$first"
dog 83
tiger 2
lion 23
elephant 1

cat "$second"
dog 8
tiger 99
lion 299
elephant 2323

只需更改n的值即可获得您喜欢的部分

答案 2 :(得分:0)

这是一种将初始文件拆分为多个文件的方法,每个文件都有一个部分:

cat animals.txt | sed -n '/dog/,/elephant/{/dog/h;/dog/!{x;G;h;};/elephant/{a \
NEXT
p}};' | awk 'BEGIN {RS="\nNEXT\n"};$0 {print $0 > "file" NR}'

然后

echo "$(cat file1)"
echo "$(cat file2)"
...