【问题标题】:How to capitalize and replace characters in shell script in one echo如何在一个回显中大写和替换 shell 脚本中的字符
【发布时间】:2021-05-12 12:08:48
【问题描述】:

我正在尝试找到一种方法来在一个回显中大写和替换字符串的破折号。我无法使用多行来重新分配字符串值。

例如: string='test-e2e-uber' 需要 echo $string 作为 TEST_E2E_UBER

我目前可以通过利用来做一个或另一个

${string^^} 大写

${string//-/_} 替换

但是,当我尝试组合它们时,它似乎不起作用(替换错误)。 是否有正确的语法来实现这一点?

echo ${string^^//-/_}

【问题讨论】:

  • 我看到过有关同时进行两次替换的问题,答案是否定的,这是不可能的。所以恐怕^^//.../... 的组合也行不通。只需通过中间分配分两步完成。
  • 您可以考虑分两步进行:string=${string^^}; string=${string//-/_}
  • 如果通过tr 管道是一个选项,您可以使用echo "$string" | tr '[:lower:]-' '[:upper:]_'
  • @Balry: 字符串abüßà 应该如何翻译?还是包含法语双声 æ 的字符串?

标签: string bash shell replace uppercase


【解决方案1】:

这并不能直接回答您的问题,但仍然遵循脚本可以实现您想要的:

declare -u string='test-e2e-uber'
echo ${string//-/_}

【讨论】:

    【解决方案2】:

    为什么你这么不喜欢有两个连续的赋值语句?如果你真的讨厌它,你将不得不恢复到一些外部程序来为你完成任务,例如

    string=$(tr  a-z- A-Z_ <<<$string)
    

    但我认为为这样一个简单的操作创建一个子进程是一种资源浪费。

    【讨论】:

      【解决方案3】:
      1. 您可以直接使用“tr”命令执行此操作,只需一个“echo”即可
      echo "$string" | tr "-" "_" | tr "[:lower:]" "[:upper:]"
      TEST_E2E_UBER
      

      我不认为 'tr' 只允许在一个命令中转换 2 个对象,所以我使用管道进行输出重定向

      1. 或者您可以使用 'awk' 执行类似的操作
      echo "$string" | awk '{gsub("-","_",$0)} {print toupper($0)}'
      TEST_E2E_UBER
      

      在这种情况下,我将用“gsub”替换连字符,然后将整个记录打印为大写

      【讨论】:

      • 您应该同时引用变量引用("$string" 而不仅仅是$string)和[...] 参数到tr,以避免意外的解析/通配符扩展。
      猜你喜欢
      • 1970-01-01
      • 2015-05-08
      • 2014-11-24
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 2012-10-24
      相关资源
      最近更新 更多