【问题标题】:Regular Expressions in BASH?BASH 中的正则表达式?
【发布时间】:2011-07-27 14:02:14
【问题描述】:

我可以在 Perl 中使用正则表达式,但之前不必在 BASH 中这样做。

我尝试在谷歌上搜索一些关于它的教程,但没有看到任何真正好的教程,就像 Perl 一样。

我想要实现的是从名为 $filename 的变量中去除 /home/devtestdocs/devtestdocs-repo/ 并将其替换为另一个名为 $testdocsdirurl 的变量

希望这是有道理的,如果有人有任何好的链接,将不胜感激。

另一种方法可能是,如果某人已经编写了一个函数来在 bash 中进行查找和替换。

【问题讨论】:

  • 我认为这里不需要正则表达式。你能解释一下为什么你认为你需要它们吗?

标签: regex bash shell


【解决方案1】:

sed 是 Unix 中字符串操作的典型武器:

echo $filename | sed s/\\/home\\/devtestdocs\\/devtestdocs-repo\\//$testdocsdirurl/

此外,正如 hop 所建议的,您可以使用 @ 语法来避免转义路径:

echo $filename | sed s@/home/devtestdocs/devtestdocs-repo/@$testdocsdirurl@

【讨论】:

  • sed 通常也能理解 s@pattern@string@,因此您不必痛苦地逃避路径中的斜线。
  • @hop:谢谢,不知道那个语法。
  • @JG,@hop 只是为了澄清事实 - sed 实际上会采用您喜欢的任何字符......所以即使是这样的愚蠢表达也可以工作echo SSSSS | sed 'sqSqsqg'
【解决方案2】:

不用正则表达式也可以实现:

somepath="/foo/bar/baz"
newprefix="/alpha/beta/"
newpath="$newprefix${somepath##/foo/bar/}"

【讨论】:

    【解决方案3】:

    是的,bash 支持正则表达式,例如

    $ [[ 'abc' =~ (.)(.)(.) ]]
    $ echo ${BASH_REMATCH[1]}
    a
    $ echo ${BASH_REMATCH[2]}
    b
    

    但您可能更愿意使用basename 实用程序

    $ f='/some/path/file.ext'
    $ echo "/new/path/$(basename $f)"
    /new/path/file.ext
    

    优秀的信息来源是 bash 手册页

    【讨论】:

      【解决方案4】:

      使用 bash

      pattern=/home/devtestdocs/devtestdocs-repo/
      testdocsdirurl=/tmp/
      filename=/foo/bar/home/devtestdocs/devtestdocs-repo/filename
      echo ${filename/$pattern/$testdocsdirurl}  # => /foo/bar/tmp/filename
      

      【讨论】:

        【解决方案5】:

        为什么需要正则表达式?

        这些只是几种可能性:

        $ filename=/home/devtestdocs/devtestdocs-repo/foo.txt
        $ echo ${filename/'/home/devtestdocs/devtestdocs-repo/'/'blah/'}
        blah/foo.txt
        $ basename $filename
        foo.txt
        $ realfilename=$(basename "$filename")
        

        【讨论】:

        • 谢谢,我只是认为使用正则表达式是解决这个问题的方法。
        • @martincarlin87:一个好的经验法则是:正则表达式应该是解决任何问题的最后方法。
        【解决方案6】:

        您正在寻找如何在 powershell 中使用正则表达式的示例?

        这里有例子吗:

        $input = "hello,123"
        $pattern = ([regex]"[0-9]+")
        $match = $pattern.match($input)
        $ok = $input -match $pattern #return an boolean value if matched..
        if($ok) { 
            $output = $match.groups[0].value
            [console]::write($output)
         } else {
           //no match
         }
        

        在“bash 经典”正则表达式中的使用是不稳定的。 你可以使用这个: http://www.robvanderwoude.com/findstr.php

        【讨论】:

        • 他要求的是 UNIX shell bash (Bourne Again SHell),而不是批处理文件或 Window PowerShell。
        猜你喜欢
        • 2019-08-10
        • 2013-07-13
        • 1970-01-01
        • 2019-08-04
        • 2013-06-06
        • 1970-01-01
        • 2016-11-11
        • 2018-04-16
        • 2011-11-01
        相关资源
        最近更新 更多