【问题标题】:Bash Script: replace white space with "\ " in stringBash Script:用字符串中的“\”替换空格
【发布时间】:2018-12-26 14:23:12
【问题描述】:

我目前正在迭代类似这样的值:

Administer PoolA servers :id=server@Pool@5@example.com

并想用“\”替换空格以使其看起来像这样(或在每个空格之前添加 \):

Administer\ PoolA\ servers\ :id=server@Pool@5@example.com

我知道正则表达式会帮助我做到这一点,但没有成功,任何帮助将不胜感激。

【问题讨论】:

  • 这里的上下文是什么?通常,添加文字反斜杠是错误的(也就是说,没有完成您打算做的事情),特别是如果您希望以这种方式生成字符串将使您扩展包含的变量它不加引号并将结果解析为一个单词;然而,在正确引用的上下文中使用包含此类值的变量可能会解决问题。确保 BashFAQ #50 不适用。
  • 另外,您同时标记了 bash 和 sh。这是两个不同的 shell,需要两个不同的答案: 最佳实践 bash 答案(假设您 真的 想要在字符串中添加文字反斜杠)将使用 parameter expansion 其中 @987654327 @不支持;请只标记其中一个。

标签: string bash shell replace sh


【解决方案1】:

没有必要为此使用正则表达式。您可以使用 bash Parameter Expansion 运算符进行字符串替换。

$ str='Administer PoolA servers :id=server@Pool@5@example.com'
$ newStr="${str// /\\ }"
$ echo "$newStr"
Administer\ PoolA\ servers\ :id=server@Pool@5@example.com

【讨论】:

  • 就我个人而言,我会说${str// /'\ '} 只是为了完全清楚反斜杠是字面意思,而不是依赖于无法识别的反斜杠转义序列的后备行为——但是显然,这两种方式都有效。
  • @CharlesDuffy 我最初有一个转义的反斜杠,然后看到我不需要转义它,所以我发布了那个版本,没有意识到这是一个后备行为。
  • 我不记得是单引号还是双引号来识别转义序列。 :(
  • 这个解决方案非常适合我的用例,谢谢
  • @CharlesDuffy 我会坚持使用转义版本,因为单引号版本会将单引号视为文字 if 整个内容都在双引号中。也就是说,newStr=${str// /'\ '} 有效,但 newStr="${str// /'\ '}" 和 echo "${str// /'\ '}" 都将文字单引号放在最后的字符串中。哇!
【解决方案2】:
mystring="Administer PoolA servers :id=server@Pool@5@example.com"
echo "$mystring" | sed "s/ /\\\ /g"
# --> Administer\ PoolA\ servers\ :id=server@Pool@5@example.com

【讨论】:

  • 这是错误的——如果字符串包含*,你的命令的结果将有一个文件名列表。
  • 如果它连续包含多个空格,它们将被合并为一个空格。您通常应该引用您的变量。
  • 感谢您的提示。如果我引用变量,它会解决这两个问题吗?
  • 是的。它仍然会比必要的慢,但引用变量将解决上述两个问题。 (还有一些由echo 引起的极端情况;例如,如果mystring="-n" 输出未定义;printf '%s\n' "$mystring" 比echo "$mystring" 更可靠一点,尽管添加引号可以解决最大的问题)。另请参阅BashPitfalls #14 和POSIX echo spec 的应用程序部分。
猜你喜欢
  • 2012-08-09
  • 2013-09-28
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
相关资源
最近更新 更多