Регулярные выражения в BASH? - PullRequest
3 голосов
/ 27 июля 2011

Я в порядке с регулярными выражениями в Perl, но раньше мне не приходилось делать это в BASH.

Я пытался найти какой-то учебник по Google, но пока не нашел действительно хороших примеров.есть с Perl.

То, что я пытаюсь добиться, это удалить /home/devtestdocs/devtestdocs-repo/ из переменной с именем $filename и заменить ее другой переменной с именем $testdocsdirurl

Надеемся,смысл, и если у кого-то есть хорошие ссылки, которые будут высоко оценены.

Другой способ может быть, если уже есть функция, которую кто-то написал для поиска и замены в bash.

Ответы [ 6 ]

3 голосов
/ 27 июля 2011

да, 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 голосов
/ 27 июля 2011

Вы можете достичь этого без регулярного выражения:

somepath="/foo/bar/baz"
newprefix="/alpha/beta/"
newpath="$newprefix${somepath##/foo/bar/}"
3 голосов
/ 27 июля 2011

sed - это типичное оружие для выбора струн в Unix:

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

Кроме того, как подсказывает хоп, вы можете использовать синтаксис @, чтобы избежать выхода из пути:

echo $filename | sed s@/home/devtestdocs/devtestdocs-repo/@$testdocsdirurl@
1 голос
/ 27 июля 2011

с баш

pattern=/home/devtestdocs/devtestdocs-repo/
testdocsdirurl=/tmp/
filename=/foo/bar/home/devtestdocs/devtestdocs-repo/filename
echo ${filename/$pattern/$testdocsdirurl}  # => /foo/bar/tmp/filename
0 голосов
/ 27 июля 2011

вы ищете пример использования регулярных выражений в 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

0 голосов
/ 27 июля 2011

Зачем вам для этого регулярные выражения?

Это всего лишь несколько возможностей:

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