拆分字符串并将单个字符串传递给bash中的for循环

时间:2015-01-26 01:17:56

标签: string bash for-loop awk split

假设您有一个名为$cnt的(多行)字符串:

Foo
X
Y
Z
Foo
A
B
C
D

可以使用awk将正则表达式串联到多个版块中,如下所示:

awk '/Foo/{i++}{print > "dat"i}' <<<"$cnt"

结果是大量文件dat1dat2,...

但字符串的不同部分必须由其他命令处理,因此当然可以定义for循环:

for f in "dat*"
do
    #commands to process $f file
done

然而,文件对于中间结果来说不是一个好的解决方案,因为它们很慢,全局(它们可以与其他文件交互),使用更多内存(因为所有文件都是先生成的,而迭代方法可以重用处理后释放的内存)上一个切片),...因此,如果可以将实例作为变量处理,那会更好。有没有方便的方法来做到这一点。

请注意,不同的部分可能包含新行,因此仅read行不足。

因此要处理的第一个切片是:

Foo
X
Y
Z

第二个切片应为:

Foo
A
B
C
D

1 个答案:

答案 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"