Regex 如何在bash中小写和替换空格?
在PHP中: 如何在BASH脚本中执行相同的操作?php在BASH中Regex 如何在bash中小写和替换空格?,regex,bash,perl,sed,Regex,Bash,Perl,Sed,在PHP中: 如何在BASH脚本中执行相同的操作?php在BASH中 $output = preg_replace("/[^a-z]/","_",strtolower($input)); 您是否正在寻找模式替换(${parameter/Pattern/string})和大小写修改(${parameter,Pattern})?如果是这样,您将在参数扩展主题下找到更多信息 $ php -r "echo preg_replace(""/[^a-z]/"",""_"",strtolower($argv
$output = preg_replace("/[^a-z]/","_",strtolower($input));
您是否正在寻找模式替换(
${parameter/Pattern/string}
)和大小写修改(${parameter,Pattern}
)?如果是这样,您将在参数扩展主题下找到更多信息
$ php -r "echo preg_replace(""/[^a-z]/"",""_"",strtolower($argv[1]));" A1B2C
a_b_c
但是需要注意的是,BASH版本使用模式而不是正则表达式。例如,模式*
类似于正则表达式*
。模式?
是
需要bash4(用4.3.48测试)
假设在变量输出
的值中不需要大写字符,我建议如下:
$ a="FOO BAR BLUB"
$ tmp=${a// /_}
$ echo ${tmp,,}
foo_bar_blub
:将变量定义为仅小写。从typeset-l输出
: 为变量赋值时,所有大写字符都将转换为小写manbash
:用下划线替换所有空格output=${input//}
typeset-u variable
将其定义为“全大写”。
请参见manbash
更新:再次访问时,我意识到我的答案与问题标题匹配,但与PHP代码不匹配。在PHP示例中,所有非
a-z
的字符都替换为下划线。因此,如果input
包含冒号或逗号,则它们也将替换为下划线
下面是与以下内容匹配的代码:
typeset -l output
output=${input// /_}
最后,引用@micha wiedenmann的答案:
但是需要注意的是,BASH版本使用模式而不是正则表达式。例如,模式*
类似于正则表达式*
。模式?
是
检查手册页并搜索“模式匹配”。此功能:
typeset -l output
output=${input//[^a-z]/_}
$input
只是bash脚本中定义的一个变量
或者,它也可以在bash4+之后运行。我认为您可以在控制台模式下运行PHP,从STDIN获取输入并打印到stdout。或者,使用Perl:
Perl-wple'$\uLc$\uU=~s/[^a-z]/\ug'
这不起作用:$output=$input>>php-r preg\u replace(“/[^a-z]/”、“\uz”、strtolower(fgets(STDIN));您希望您的代码片段做什么?它根本不是有效的shell语法。也许你的问题是如何将STDIN上的输入从shell发送到程序?问题似乎是:实现相同效果的等效命令是什么。我觉得这个方法非常合适,我很惊讶所有的混乱都来自哪里。请在bash中包含$input和$output变量line@simpatico您将真正需要了解shell是如何工作的。没有“输入变量”和“输出变量”。您需要将这些值通过管道传输到被调用的程序中。你需要学习shell编程,但这个网站并不是教你如何编程。或者:我以前学过shell的工作原理,写过几个bash脚本,但是我的知识有一个缺口,我在此谦虚地问一下。感谢那些知道答案的人。谢谢你教我有关排版-l
!在bash-3.2中,我得到了“typeset:-l:invalid option”,而在manbash中,选项只有-a、-f、-I、-r、-t和-xUpgrading到bash-4.4 itworks@simpatico更新到bash4.*是个好主意。这里的大多数人都认为我们在回答问题时会谈论bash4。顺便说一句:Bash5几天前发布,但我会等待更新到那个版本。@user7369280,macos最新的默认版本仍然是bash-3.2。macports上的最新版本是4.4,要使用它,脚本必须以#开头/usr/bin/env bashMicha,我在回答中引用了你的最后一句话。
output=`php -r "echo preg_replace("/[^a-z]/","_",strtolower($input));"`
echo $output