【问题标题】:bash replace one character from the end of stringbash 替换字符串末尾的一个字符
【发布时间】:2017-08-02 17:21:17
【问题描述】:

我需要将字符串中的最后一个点替换为字符“-”。

# a='2.5.2.pl'

使用以下表达式:

# echo ${a/%./-}

我希望得到:

2.5.2-pl

但我明白了

2.5.2.pl

我注意到只有当我需要将点从末尾替换到开头时它才起作用。为什么会发生? 当然我可以使用 awk、sed 等外部​​程序来解决这个问题,但我需要只使用 bash 来解决问题。

感谢您的建议!

【问题讨论】:

    标签: string bash shell replace


    【解决方案1】:

    用 bash 的Parameter Expansion:

    a='2.5.2.pl'
    echo "${a%.*}-${a##*.}"
    

    输出:

    2.5.2-pl

    【讨论】:

      【解决方案2】:

      我的方法有点老套,使用rev,但我测试了它,它可以工作!

      echo "$(_b=$(echo "$a" | rev); _b=${_b/./-}; echo "$_b" | rev)"
      

      基本上,我只是颠倒了字符顺序,所以最后一个. 是第一个,然后使用${var/./-} 将点替换为破折号,最后再次颠倒字符的顺序。

      【讨论】:

      • 这里有很多错误。尝试在您的字符串中使用空格包围的通配符、制表符或其他奇怪的字符——请参阅BashPitfalls #14。 (让 看起来 像它一样工作的东西很容易,而在使用稍微不同的数据执行时也会出现错误,这就是为什么理解 bash 的执行模型而不是接受成功的测试很重要的部分原因除了进行测试的特定输入和域之外,还有意义)。
      • 我不认为这是 OP 要求的问题。
      • 代码在其初始域之外被重用。稳健的实践可以安全地重复使用;脆弱的做法......不是。而且重用也不是故意的——我遇到的最糟糕的数据丢失事件发生在有人草率地引用 shell 脚本时,因为它“只能”在包含匹配 [0-9a-f]{24} 的名称的目录中运行——然后一个单独的程序中的一个错误创建了一个从内存中转储垃圾的文件名,该脚本扩展了该名称中的一个 glob 并删除了 TB 的计费数据备份。
      • 无论如何,StackOverflow 的部分意义在于我们正在创建一个教学资源——教学资源中给出的代码将是正确的,这是一个合理的期望,而不是充满隐藏的陷阱和警告。
      • 好的,我会将它更新为应该在它的初始域之外工作的东西。
      猜你喜欢
      • 2011-04-10
      • 2012-02-03
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      相关资源
      最近更新 更多