【问题标题】:Replace spaces with underscores via BASH通过 BASH 用下划线替换空格
【发布时间】:2013-11-08 18:54:30
【问题描述】:

假设我有一个字符串 $str。 我希望编辑 $str 以便将其中的所有空格都替换为下划线。

例子

a="hello world"

我想要

的最终输出
echo "$a"

成为hello_world

【问题讨论】:

    标签: linux bash shell unix terminal


    【解决方案1】:

    使用sed 直接从变量中读取:

    $ sed 's/ /_/g' <<< "$a"
    hello_world
    

    要存储结果,您必须使用var=$(command) 语法:

    a=$(sed 's/ /_/g' <<< "$a")
    

    为了完整起见,awk 可以这样完成:

    $ a="hello my name is"
    $ awk 'BEGIN{OFS="_"} {for (i=1; i<NF; i++) printf "%s%s",$i,OFS; printf "%s\n", $NF}' <<< "$a"
    hello_my_name_is
    

    【讨论】:

    • 这些似乎都不能处理多个空格。
    • @WilliamHay 你是对的,没有检查多个空格。更新为使用sed .../g,默认情况下只使用一次。
    • @fedorqui +1 让我们知道直接变量的用法,而无需回显管道到 sed。我没有看到对此的直接帮助: '
    • @user1587504 它们被称为“这里的字符串”。有关更多参考,请参阅linux.die.net/abs-guide/x15683.html。它们很有用。
    • @fedorqui 。谢谢!让我知道。在脚本中使用 isql 时,我确实使用了一个带有 '
    【解决方案2】:
    $ a="hello world"
    $ echo ${a// /_}
    hello_world
    

    根据 bash(1):

    ${parameter/pattern/string}
    

    模式替换。将图案展开以产生图案 就像在路径名扩展中一样。参数被扩展并且 模式与其值的最长匹配被替换为字符串。 如果 pattern 以 / 开头,则替换所有匹配的 pattern
    用字符串。通常只替换第一场比赛。如果 模式以 # 开头,必须匹配 参数的扩展值。如果模式以 % 开头,它必须匹配 在参数扩展值的末尾。如果字符串为空, 模式的匹配被删除并且 / 以下模式可能是 省略。如果参数为@或*,则替换操作为 依次应用于每个位置参数,展开是 结果列表。如果参数是下标的数组变量 使用 @ 或 *,替换操作适用于每个成员 数组依次展开,展开就是结果列表。

    【讨论】:

    • 将此作为对 bash 文档的参考,在其他答案中缺失。
    【解决方案3】:

    纯 bash:

    a="hello world"
    echo "${a// /_}"
    

    或 tr:

    tr -s ' ' '_' <<< "$a"
    

    【讨论】:

    • +1 仅用于纯 bash 语法!。想知道它在幕后做什么。看起来它正在执行“sed”替换操作。使用这种语法的任何 bash 手册状态?。
    • @user1587504:我相信falsetru 已经为此Pattern substitution 添加了相关的man 部分
    【解决方案4】:

    您可以尝试以下方法:

    str="${str// /_}"
    

    【讨论】:

      【解决方案5】:

      多个空格加一个下划线

      这可以通过GNU shell parameter expansion 轻松实现。特别是:

      ${parameter/pattern/string}

      如果pattern以/开头,所有匹配的pattern都会被替换为字符串。

      +(pattern-list)

      匹配给定模式的一次或多次出现。

      因此:

      $ a='hello world    example'
      
      $ echo ${a// /_}
      hello_world____example
      
      $ echo ${a//+( )/_}
      hello_world_example
      

      但是for this to work in a bash script需要做两处修改:

      1. 参数扩展需要用双引号将" "封装到prevent word splittinginput field separator$IFS
      2. 需要使用shopt builtin 启用extglob shell 选项,以便识别扩展 模式匹配运算符。

      bash 脚本最终如下所示:

      #!/usr/bin/env bash
      shopt -s extglob
      a='hello world    example'
      echo "${a//+( )/_}"
      

      【讨论】:

        猜你喜欢
        • 2011-07-12
        • 2020-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多