如何将sed命令的多行输出保存到数组中?

时间:2014-03-18 23:38:12

标签: regex arrays bash variables sed

将此内容放在input.txt中:

***** START *****
Hello
Stackoverflow 
***** END *****

OMG

***START *****
How
Are you
***** END *****

使用以下命令,我将内容保存在数组中的STARTEND之间:

sed -n '/START/,/END/p' input.txt

工作正常,但如果我尝试将其保存在数组中,则无效:

arr=( $(cat input.txt | sed -n '/START/,/END/p') )

for text in $arr; do
    echo '%%%%%%%%'
    echo "$text"
    echo '%%%%%%%%'
    echo 
    echo 
done

它返回:

%%%%%%%%
*****
%%%%%%%%

%%%%%%%%
START
%%%%%%%%

%%%%%%%%
*****
%%%%%%%%

%%%%%%%%
Hello
%%%%%%%%

%%%%%%%%
Stackoverflow
%%%%%%%%

%%%%%%%%
*****
%%%%%%%%

%%%%%%%%
END
%%%%%%%%

%%%%%%%%
*****
%%%%%%%%

%%%%%%%%
***START
%%%%%%%%

%%%%%%%%
*****
%%%%%%%%

%%%%%%%%
Are
%%%%%%%%

%%%%%%%%
you
%%%%%%%%

%%%%%%%%
*****
%%%%%%%%

%%%%%%%%
END
%%%%%%%%

%%%%%%%%
*****
%%%%%%%%

所需的输出是:

%%%%%%%%
***** START *****
Hello
Stackoverflow 
***** END *****
%%%%%%%%

%%%%%%%%
***START *****
How
Are you
***** END *****
%%%%%%%%

我做错了什么?可能会改变IFS的价值?你有任何想法吗?我很感兴趣。

2 个答案:

答案 0 :(得分:1)

我认为你不能在bash数组中存储多行作为单个数组元素(或者至少我不知道这样做的方法)。您可以对STARTEND模式进行测试并进行相应的打印:

#!/bin/bash

IFS=$'\n'

arr=( $(sed -n '/START/,/END/p' file) )

for text in "${arr[@]}"; do
    if [[ "$text" =~ START ]]; then
        echo '%%%%%%%%'
        echo "$text"
    elif [[ "$text" =~ END ]]; then
        echo "$text"
        echo '%%%%%%%%'
    else
        echo "$text"
    fi
done

<强>输出

%%%%%%%%
***** START *****
Hello
Stackoverflow 
***** END *****
%%%%%%%%
%%%%%%%%
***START *****
How
Are you
***** END *****
%%%%%%%%

答案 1 :(得分:1)

我知道这不会将数据导入array,但也许您不需要数据?

awk '/START/{f=1;print "%%%%%%%%"} f; /END/{f=0;print "%%%%%%%%\n"}' file
%%%%%%%%
***** START *****
Hello
Stackoverflow
***** END *****
%%%%%%%%

%%%%%%%%
***START *****
How
Are you
***** END *****
%%%%%%%%

如果您不需要START END标签:

awk '/END/{f=0;print "%%%%%%%%\n"} f; /START/{f=1;print "%%%%%%%%"}' file
%%%%%%%%
Hello
Stackoverflow
%%%%%%%%

%%%%%%%%
How
Are you
%%%%%%%%
相关问题