我可以在Perl中使用正则表达式,但之前不必在BASH中使用它。
我尝试谷歌上的某些教程,但没有看到任何真正好的,但与Perl的方式。
我想要实现的是从名为/home/devtestdocs/devtestdocs-repo/
的变量中删除$filename
并将其替换为另一个名为$testdocsdirurl
的变量
希望这是有道理的,如果有人有任何好的链接,将非常感激。
另一种方式可能是,如果已经有人编写了一个函数来执行bash中的查找和替换。
答案 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