【问题标题】:How to lowercase and replace spaces in bash? [closed]如何小写和替换bash中的空格? [关闭]
【发布时间】:2019-01-12 07:45:29
【问题描述】:

在 PHP 中:

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

如何在 BASH 脚本中做同样的事情?

【问题讨论】:

  • 我认为你可以在控制台模式下运行 PHP,它从 STDIN 获取输入并打印到 STDOUT
  • 或者,使用 Perl:perl -wple '$_ = lc $_; $_ =~ s/[^a-z]/_/g'
  • 这不起作用:$output = $input >> php -r preg_replace("/[^a-z]/","_",strtolower(fgets(STDIN)));跨度>
  • 您希望您的 sn-p 做什么?它根本不是有效的 shell 语法。也许您的问题是如何将 STDIN 上的输入从 shell 发送到程序?
  • 问题似乎是:实现相同效果的等效命令是什么。我发现这很充分,我很惊讶所有的混乱来自哪里。

标签: regex bash perl sed


【解决方案1】:

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

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

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

【讨论】:

  • Micha,我在回答中引用了你的最后一句话。
【解决方案2】:

需要 bash4(用 4.3.48 测试)。

假设您从不希望变量 output 的值中包含大写字符,我会提出以下建议:

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

    当变量被赋值时,所有大写字符都被转换为小写。

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

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


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

所以这里的代码也与之匹配:

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

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

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

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

【讨论】:

  • 谢谢你教我typeset -l
  • 在 bash-3.2 中,我得到“排版:-l:无效选项”,而从 man bash 开始,选项只有 -a、-f、-i、-r、-t 和-x
  • 升级到 bash-4.4 就可以了
  • @simpatico 更新到 bash 4.* 是个好主意。这里的大多数人会假设我们在回答问题时会谈论 bash4。顺便说一句:Bash5 几天前就出来了,但我会等到更新到那个。
  • @user7369280,macos 最新默认仍然是 bash-3.2。 macports 上的最新版本是 4.4,要使用它,脚本必须以 #!/usr/bin/env bash 开头
【解决方案3】:

bash 中的 php?

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

【讨论】:

  • 请在您的 bash 行中包含 $input 和 $output 变量
  • @simpatico 您真的需要了解 shell 的工作原理。没有“输入变量”和“输出变量”。您需要将值通过管道传输到被调用的程序中。你需要学习 shell 编程,但是这个网站不是教你如何编程的。
  • OR:我之前了解了 shell 的工作原理并编写了几个 bash 脚本,但我在此谦虚地询问我的知识差距。感谢知道并回答的人。
【解决方案4】:

这行得通:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-07
    • 2015-05-14
    • 1970-01-01
    • 2015-02-01
    • 2014-04-02
    • 2015-07-29
    • 2010-12-14
    • 1970-01-01
    相关资源
    最近更新 更多