我正在 bash 中编写一个快速脚本,一开始我设置
IFS=$'\n'
.在我有一个 for 循环之后:
for i in *;
do
j=${i//:/}
done
无论我做什么,冒号都不会从
$i
中删除。我尝试了所有我能想到的方法来从字符串中删除字符,包括 sed
、tr
等等。我什至尝试在冒号前使用反斜杠,或在 for 循环中重置 IFS。
奇怪的是我可以替换其他字符,只是冒号对我不起作用。
我该怎么办?
我不明白 IFS 与字符串中的冒号有什么关系,但
$(echo $i | sed 's/://')
应该可以用空格替换冒号。
${string/substring/replacement}
是 Bash 字符串扩展语法,在这种情况下是正确的。IFS='\n'
将内部字段分隔符(即单词边界)设置为换行符,因此 bash 可以读取字符串中的转义序列(换行符)。默认为空格、制表符和换行符。您正在尝试读取当前目录中的所有文件名,如果有则删除冒号。上面的 shell 脚本在我的电脑(Ubuntu 22.04,Bash 版本 5.1.16)中运行良好:
❯ ls
fi:le1.txt file:2.txt file:multiple:3.jpg remove_colon.sh
❯ cat remove_colon.sh
#!/bin/bash
IFS=$'\n'
for i in *;
do
j=${i//:/}
echo "$j"
done
❯ ./remove_colon.sh
file1.txt
file2.txt
filemultiple3.jpg
remove_colon.sh