我有一个包含多个段落的文件,这些段落使用括号作为分隔符,如下所示
{
KEYWORD
a = 1
b = 2
c = 3
}
{
d = 4
KEYWORD
e = 5
f = 6
}
我想循环每个段落并将其分配给变量 $foo 同时保留换行符,因此 echo $foo 将导致该段落以多行格式输出。处理 $foo 的输出后,例如echo $foo | grep bar
程序应该转到下一段并覆盖 $foo
我一直在使用 awk,因为它似乎是这种情况下最好的工具,但我不知道如何执行某种 while 循环,以便我可以单独处理每个段落。
到目前为止我所拥有的是:
grep -Pzo "{[^}]*KEYWORD[^}]*}" FILENAME | awk "/{/{flag=1;
paragraph=\"\"; next} /}/{flag=0; print paragraph} flag {paragraph =
paragraph \$0 \"\\n\"}"
这会产生像这样整齐的段落
KEYWORD
a = 1
b = 2
c = 3
d = 4
KEYWORD
e = 5
f = 6
我陷入困境的是,我想在继续第 2 段之前对第 1 段执行进一步的操作。
我最接近的解决方案是将结果写入数组,但后来我丢失了该段落,所有内容都在一行上,并且我无法进行我想要的匹配后处理。
更新:
本着有不止一种方法可以做到这一点的精神,如果你只有一把锤子,那么一切看起来都像钉子,我提供我的解决方案:
# Read paragraphs into an array
while IFS= read -r paragraph; do
paragraphs+=("$paragraph")
done < <(awk '/\{/{flag=1; paragraph=""; next} /\}/{flag=0; print paragraph} flag {paragraph = paragraph $0}' testoutput.txt)
# Print each paragraph separately
for ((i=0; i<${#paragraphs[@]}; i++)); do
# Assign each paragraph to a variable using eval
eval "foo_$i=\"${paragraphs[$i]}\""
# Print the variable recreating the line breaks
echo "Variable foo_$i:"
eval "echo \"\$foo_$i\"|sed 's/\s\{2,\}/\n/g'"
done
成功的关键是使用 sed's/\s\{2,\}/\n/g'
而不是\s
or\s+
或一个或多个 vs 两个或多个。