假设您有一个名为$cnt
的(多行)字符串:
Foo
X
Y
Z
Foo
A
B
C
D
可以使用awk
将正则表达式串联到多个版块中,如下所示:
awk '/Foo/{i++}{print > "dat"i}' <<<"$cnt"
结果是大量文件dat1
,dat2
,...
但字符串的不同部分必须由其他命令处理,因此当然可以定义for
循环:
for f in "dat*"
do
#commands to process $f file
done
然而,文件对于中间结果来说不是一个好的解决方案,因为它们很慢,全局(它们可以与其他文件交互),使用更多内存(因为所有文件都是先生成的,而迭代方法可以重用处理后释放的内存)上一个切片),...因此,如果可以将实例作为变量处理,那会更好。有没有方便的方法来做到这一点。
请注意,不同的部分可能包含新行,因此仅read
行不足。
因此要处理的第一个切片是:
Foo
X
Y
Z
第二个切片应为:
Foo
A
B
C
D
答案 0 :(得分:1)
如果您的进程可以处理流式输入,并且您不需要对流程的输出执行任何操作,则可以直接从awk直接传输到进程,而不是通过中间文件。
awk '/Foo/{i++; if (cmd){close(cmd); cmd="whatever command you need"}{print | cmd}' <<<"$cnt"
您可以拆分输入并使用\0
分隔细分和管道到xargs -0 -n 1 whatever command
等。
你可以通过手动累积行并在每个新标题上调用进程来使用shell读取循环。
while IFS= read -r line; do
if [ "$line" = "$sentinel" ]; then
if [ -n "$acc" ]; then
whatever command "$acc"
fi
acc=""
fi
acc+="$line"$'\n'
done <<<"$cnt"