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)