You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWK分段处理大括号分隔文本段落的需求与实现方案

逐段处理大括号分隔的文件内容并保留换行格式

我有一个以大括号作为段落分隔符的文件,内容示例如下:

{
KEYWORD
a = 1
b = 2
c = 3
}
{
d = 4
KEYWORD
e = 5
f = 6
}

需求是:循环遍历每个大括号包裹的段落,将其赋值给变量$foo,且保留换行符,执行echo $foo时能以多行格式输出该段落。完成对$foo的后续处理(比如echo $foo | grep bar)后,再处理下一个段落并覆盖$foo。

尝试过的方法

我尝试用AWK工具处理,写出的代码如下:

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

遇到的卡点

我没法实现逐个段落处理的逻辑——想先处理完第一段再继续第二段。之前尝试把结果写入数组,但段落格式丢失,所有内容变成一行,无法进行后续匹配处理。

自行实现的解决方案

后来我找到了解决方案,代码如下:

# 读取段落到数组
while IFS= read -r paragraph; do
    paragraphs+=("$paragraph")
done < <(awk '/\{/{flag=1; paragraph=""; next} /\}/{flag=0; print paragraph} flag {paragraph = paragraph $0}' testoutput.txt)

# 逐个处理段落
for ((i=0; i<${#paragraphs[@]}; i++)); do
    # 使用eval将段落赋值给变量
    eval "foo_$i=\"${paragraphs[$i]}\""

    # 输出变量并还原换行格式
    echo "Variable foo_$i:"
    eval "echo \"\$foo_$i\"|sed 's/\s\{2,\}/\n/g'"
done

成功的关键在于使用sed命令s/\s\{2,\}/\n/g——匹配两个及以上空白字符替换为换行,而不是匹配一个及以上的\s或\s+。

内容的提问来源于stack exchange,提问作者eramm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 04:10:16