我有 file.txt 需要读入 Bash 数组。然后我需要删除每个条目中的空格、双引号和除第一个逗号之外的所有内容。这是我已经走了多远:
$ cat file.txt
10,this
2 0 , i s
30,"all"
40,I
50,n,e,e,d,2
60",s e,e"
$ cat script.sh
#!/bin/bash
readarray -t ARRAY<$1
ARRAY=( "${ARRAY[@]// /}" )
ARRAY=( "${ARRAY[@]//\"/}" )
for ELEMENT in "${ARRAY[@]}";do
echo "|ELEMENT|$ELEMENT|"
done
$ ./script.sh file.txt
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,n,e,e,d,2|
|ELEMENT|60,se,e|
除了逗号情况外,效果很好。我知道有多种方法可以给这只猫换皮,但由于脚本较大,这是其中的一部分,我真的很想使用参数替换来到达这里:
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,need2|
|ELEMENT|60,see|
这可以通过参数替换吗?
据我所见,无需将其读入
bash
数组即可创建该输出:该
sed
表达式删除空格和双引号,将第一个逗号替换为空格(此时字符串中没有其他空格),删除所有其他逗号,恢复第一个逗号,以及前置和附加额外数据。或者,使用 GNU
sed
:(标准
sed
不支持将2
和组合为命令g
的标志s
)。sed
在加载到数组之前,我会删除你需要删除的内容(还要注意小写的变量名,通常最好避免在 shell 脚本中使用大写的变量):这会在您的示例文件中生成以下输出:
如果您确实必须使用参数替换,请尝试以下操作:
改掉使用 ALLCAPS 变量名的习惯。您最终会与 PATH 之类的关键“系统”变量发生冲突并破坏您的代码。
[这本质上是格伦杰克曼答案的更完整版本]
从剥离的键和值构建关联数组,使用第一个逗号作为分隔符:
您可以遍历数组并使用中间变量:
这分配给
rest
第一个逗号之后的部分;然后我们将三个部分连接回原始变量:rest
每个逗号