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

sim*_*ico -5 regex bash perl sed

在PHP中:

$output = preg_replace("/[^a-z]/","_",strtolower($input));
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ann 5

您是否正在寻找模式替换${parameter/pattern/string})和案例修改${parameter,,pattern})?如果是这样,您将在Parameter Expansionman bash主题下找到更多信息。

$ a="FOO BAR BLUB"
$ tmp=${a// /_}
$ echo ${tmp,,}
foo_bar_blub
Run Code Online (Sandbox Code Playgroud)

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


Ral*_*alf 5

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

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

typeset -l output
output=${input// /_}
Run Code Online (Sandbox Code Playgroud)
  • typeset -l output:将变量定义为仅小写。来自man bash

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

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

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


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

因此,这里的代码也与之匹配:

typeset -l output
output=${input//[^a-z]/_}
Run Code Online (Sandbox Code Playgroud)

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

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

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