将此内容放在input.txt中:
***** START *****
Hello
Stackoverflow
***** END *****
OMG
***START *****
How
Are you
***** END *****
使用以下命令,我将内容保存在数组中的START
和END
之间:
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的价值?你有任何想法吗?我很感兴趣。
答案 0 :(得分:1)
我认为你不能在bash
数组中存储多行作为单个数组元素(或者至少我不知道这样做的方法)。您可以对START
和END
模式进行测试并进行相应的打印:
#!/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
%%%%%%%%