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
相关产品推荐
相关产品推荐

