BASH中的正则表达式?

时间:2011-07-27 14:02:15

标签: regex bash shell

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

我尝试谷歌上的某些教程,但没有看到任何真正好的,但与Perl的方式。

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

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

另一种方式可能是,如果已经有人编写了一个函数来执行bash中的查找和替换。

6 个答案:

答案 0 :(得分:3)

sed是Unix中字符串操作的首选武器:

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

另外,正如Hop建议的那样,您可以使用@语法来避免转义路径:

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

答案 1 :(得分:3)

您可以在没有正则表达式的情况下实现此目的:

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

答案 2 :(得分: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手册页

答案 3 :(得分:1)

使用bash

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

答案 4 :(得分:0)

为什么你需要正则表达式?

这些只是一些可能性:

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

答案 5 :(得分:0)

你正在寻找一个如何在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 classic'中使用正则表达式是不稳定的。 你可以用这个: http://www.robvanderwoude.com/findstr.php