如何在bash中小写和替换空格?

时间:2019-01-12 07:45:30

标签: regex bash perl sed

在PHP中:

$output = preg_replace("/[^a-z]/","_",strtolower($input));

如何在BASH脚本中执行相同的操作?

4 个答案:

答案 0 :(得分:5)

您是否正在寻找模式替换${parameter/pattern/string})和案例修改${parameter,,pattern})?如果是这样,您会在man bash中的参数扩展主题下找到更多信息。

$ a="FOO BAR BLUB"
$ tmp=${a// /_}
$ echo ${tmp,,}
foo_bar_blub

但是要注意的一件事是BASH版本使用模式而不是正则表达式。例如,模式*与正则表达式.*类似。模式?.

答案 1 :(得分:4)

需要bash4(已通过4.3.48测试)。

假设您从不希望变量output的值中使用大写字母,我将提出以下建议:

typeset -l output
output=${input// /_}
  • typeset -l output:将变量定义为仅小写。来自man bash

      

    为变量分配值后,所有大写字符都将转换为小写。

  • output=${input// /_}:用下划线替换所有空格。

顺便说一句:还有typeset -u variable将其定义为“全部大写”。 参见man bash


更新:重新审视时,我意识到我的答案与问题题名匹配,但与PHP代码不匹配。在PHP示例中,所有不是 a-z的字符都用下划线替换。因此,如果input包含冒号或逗号,则它们也将由下划线替换。

下面是与此匹配的代码:

typeset -l output
output=${input//[^a-z]/_}

最后引用@ micha-wiedenmann的答案:

  

但是要注意的一件事是BASH版本使用模式而不是正则表达式。例如,模式*与正则表达式.*类似。模式?.

检查手册页并搜索“模式匹配”。

答案 2 :(得分:0)

bash中的php吗?

$ php -r "echo preg_replace(""/[^a-z]/"",""_"",strtolower($argv[1]));" A1B2C
a_b_c

答案 3 :(得分:0)

这有效:

output=`php -r "echo preg_replace("/[^a-z]/","_",strtolower($input));"`
echo $output

$input只是bash脚本中定义的变量。

或者,@user7369280's answer也可以从bash4 +开始使用。