我有一个名为"动物"其中包含以下两个部分:
$ 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
..但这会存储两个部分的输出。任何建议,如何在关键字在文件中重复时如何在两个关键字之间打印行,每个行范围应该存储到单独的变量中?
答案 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)"
...