String 如何在Bash中将字符串转换为所有空格?
出于格式化目的,我想用空格替换字符串中的所有字符String 如何在Bash中将字符串转换为所有空格?,string,bash,unix,replace,String,Bash,Unix,Replace,出于格式化目的,我想用空格替换字符串中的所有字符 STR="some string of unknown length" SPC=" " <--- this is what I want 但这只替换字母,而不是数字或任何特殊字符。对于这种类型的Bash字符串替换,“任意字符”的占位符是什么?您可以使用: str="some string of unknown length" spc="${str//[^[:space:]]/ }"
STR="some string of unknown length"
SPC=" " <--- this is what I want
但这只替换字母,而不是数字或任何特殊字符。对于这种类型的Bash字符串替换,“任意字符”的占位符是什么?您可以使用:
str="some string of unknown length"
spc="${str//[^[:space:]]/ }"
[^[:space:]
将匹配任何非空格字符并用空格替换
核实:
echo "$str" | wc -c
30
echo "$spc" | wc -c
30
PS:您还可以执行以下操作:
spc="${str//?/ }"
获取长度相同且仅包含空格的字符串<代码>?匹配glob中的任何字符。这是一种替代(根本没有正则表达式/解析)解决方案:
STR='some string of unknown length.' # Actually 30 chars
# Create an SCP var of the same length of STR filled with spaces (# updated implementation, thanks gniourf_gniourf)
printf -v SCP '%*s' ${#STR}
测试:
echo "${STR}" # 'some string of unknown length.'
echo "${SCP}" # ' '
echo "Length STR -> ${#STR}" # 'Length STR -> 30'
echo "Length SCP -> ${#SCP}" # 'Length SCP -> 30'
printf '%*s' 3 # ' '
printf '%*s' 3 . # ' .'
printf '%*s' 3 123 # '123'
printf '%*s' 3 12345 # '12345'
它的工作原理:
echo "${STR}" # 'some string of unknown length.'
echo "${SCP}" # ' '
echo "Length STR -> ${#STR}" # 'Length STR -> 30'
echo "Length SCP -> ${#SCP}" # 'Length SCP -> 30'
printf '%*s' 3 # ' '
printf '%*s' 3 . # ' .'
printf '%*s' 3 123 # '123'
printf '%*s' 3 12345 # '12345'
printf
命令在变量SCP
中写入长度至少等于STR
的字符数的字符串(${STR}
)
由于${STR}
之后没有进一步的参数,所以这些技巧在s
中未被替换
用法示例:
echo "${STR}" # 'some string of unknown length.'
echo "${SCP}" # ' '
echo "Length STR -> ${#STR}" # 'Length STR -> 30'
echo "Length SCP -> ${#SCP}" # 'Length SCP -> 30'
printf '%*s' 3 # ' '
printf '%*s' 3 . # ' .'
printf '%*s' 3 123 # '123'
printf '%*s' 3 12345 # '12345'
为什么要麻烦匹配非空格字符?将一个空格转换成一个空格可能毫无意义,但它比正则表达式读起来更好。谢谢你的问号!我试过用一个点和一个星…;-)@阿努巴瓦:我不知道为什么,但是你在我的环境(GNUBash,VersionOne 4.3.11(1)-发行版(x86_64-pc-linux-GNU))中的解决方案不起作用……我不确定为什么,
“${str/?/}”
在我尝试过的所有bash版本上都适用。它甚至可以在OSXI上的旧版本BASH 3.2上运行。我不太清楚为什么要为了格式化而这样做,因为对于大多数格式化目的,可以使用printf
。例如,str=“长度未知的字符串”;printf“%*s |%s\n%s |%s\n“${str}”你好“$str”再见“
。说得好。我只是不知道。。。在echo
上卡住,而不是使用printf
。谢谢你的提示。相反:printf-vscp'%*s'${str}
:没有子shell,也没有外部工具。这与问题无关,但这也是POSIX兼容的(无论如何,这是一个变体,以牺牲单个子shell为代价:SPC=$(printf%${str s)
。