【问题标题】:How to convert a String to all spaces in Bash?如何将字符串转换为 Bash 中的所有空格?
【发布时间】:2016-03-08 06:37:11
【问题描述】:

出于格式化目的,我想用空格替换字符串的所有字符。

STR="some string of unknown length"
SPC="                             " <--- this is what I want

this page 的帮助下,我能想到的最好办法是:

SPC=${STR//[a-Z]/ }

但这只会替换字母,而不是数字或任何特殊字符。这种类型的 Bash 字符串替换的“任何字符”的占位符是什么?

【问题讨论】:

  • 我不太清楚您为什么要这样做出于格式化目的, 因为对于大多数格式化目的,您可以使用printf。例如,str="some string of unknown length"; printf '%*s|%s\n%s|%s\n' "${#str}" "" "hello" "$str" "goodbye"
  • 好点。我根本没有意识到这一点......太坚持echo而不是使用printf。感谢您的提示。

标签: string bash unix replace


【解决方案1】:

你可以使用:

str="some string of unknown length"
spc="${str//[^[:space:]]/ }"

[^[:space:]] 将匹配任何非空格字符并将其替换为空格。

验证:

echo "$str" | wc -c
30
echo "$spc" | wc -c
30

PS:你也可以这样做:

spc="${str//?/ }"

获取仅包含空格的相同长度的字符串。 ? 匹配 glob 中的任何字符。

【讨论】:

  • 为什么要匹配非空格字符?将空格转换为空格可能毫无意义,但它比正则表达式更好读。
  • 谢谢你的问号!我尝试了一个点和一个星... ;-)
  • @anubhava:我不知道为什么,但是您在我的环境中的解决方案(GNU bash,版本 4.3.11(1)-release (x86_64-pc-linux-gnu) )不​​起作用。 ..
  • 不知道为什么"${str//?/ }" 在我尝试过的所有 BASH 版本上都对我有效。它甚至适用于 OSX 上的旧 BASH 3.2
【解决方案2】:

这是一种替代方案(根本没有正则表达式/解析):

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 命令在变量SCP 中写入长度至少等于STR (${#STR}) 的字符数的字符串。

技巧在于s没有被替换,因为${#STR}之后没有进一步的参数。

使用示例

printf '%*s' 3       # '   '
printf '%*s' 3 .     # '  .'
printf '%*s' 3 123   # '123'
printf '%*s' 3 12345 # '12345'

【讨论】:

  • 宁可:printf -v scp '%*s' "${#str}":没有子shell,也没有外部工具。
  • 与问题无关,但这也是 POSIX 兼容的(好吧,无论如何,这是一个变体,以牺牲单个子外壳为代价:SPC=$(printf %${#STR}s)
猜你喜欢
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多