Bash:将行转换为数组,同时保留项目中的连续空格
Bash: convert line to array while keeping consecutive spaces in items
Bash 中有很多关于如何将一行转换为数组的帖子。我没有找到可以回答我的问题的答案:当项目可以有连续的空格并且您不希望它们折叠成一个字符时,如何进行转换?
示例输入行:a bcd "ef gh" " ijk "
预期数组项:"a", "bcd", "ef gh", " ijk "
所以最后一个不应该是 " ijk "
,这是使用标准 arr=$(line)
解决方案时的结果。
当输入行中参数之间的连续空白字符折叠时,我可以接受。
这个例子真的只是一个例子。输入行将从包含许多要转换的不同行的文件中读取。
有什么想法吗?
与我的评论部分矛盾,如果你修改你的输入文件看起来像
a bcd ef\ gh \ \ \ ijk\ \ \
然后
while read -a arr; do
printf "%s\n" "${arr[@]}"
done < file.txt
将按照您想要的方式保留转义空格。 (如果没有 -r
,read
只会对未转义的空格进行分词。)与正常的 shell 处理不同,这里的 "ef gh"
不等同于 ef\ gh
.
我在评论中提到的解决方案是对输入文件进行更大量的修改:
a
bcd
ef gh
ijk
#
l m
n op
#
q r s
tu v
和类似
的循环
while :; do
arr=()
while IFS= read -r element; do
if [[ element = #* ]]; then
# do something with arr here
break
fi
arr+=("$element")
done
done < file.txt
Bash 中有很多关于如何将一行转换为数组的帖子。我没有找到可以回答我的问题的答案:当项目可以有连续的空格并且您不希望它们折叠成一个字符时,如何进行转换?
示例输入行:a bcd "ef gh" " ijk "
预期数组项:"a", "bcd", "ef gh", " ijk "
所以最后一个不应该是 " ijk "
,这是使用标准 arr=$(line)
解决方案时的结果。
当输入行中参数之间的连续空白字符折叠时,我可以接受。
这个例子真的只是一个例子。输入行将从包含许多要转换的不同行的文件中读取。
有什么想法吗?
与我的评论部分矛盾,如果你修改你的输入文件看起来像
a bcd ef\ gh \ \ \ ijk\ \ \
然后
while read -a arr; do
printf "%s\n" "${arr[@]}"
done < file.txt
将按照您想要的方式保留转义空格。 (如果没有 -r
,read
只会对未转义的空格进行分词。)与正常的 shell 处理不同,这里的 "ef gh"
不等同于 ef\ gh
.
我在评论中提到的解决方案是对输入文件进行更大量的修改:
a
bcd
ef gh
ijk
#
l m
n op
#
q r s
tu v
和类似
的循环while :; do
arr=()
while IFS= read -r element; do
if [[ element = #* ]]; then
# do something with arr here
break
fi
arr+=("$element")
done
done < file.txt