在PHP中:
$output = preg_replace("/[^a-z]/","_",strtolower($input));
如何在BASH脚本中执行相同的操作?
答案 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 +开始使用。