试着用bash写一个正则表达式

时间:2015-04-15 09:26:31

标签: regex bash

我是regex的新手,我正在尝试用bash脚本编写一个正则表达式。 我试图将line与正则表达式匹配,该正则表达式必须返回行中的第二个单词。

regex = "commit\s+(.*)"
line = "commit 5456eee"
if [$line =~ $regex] 
then
 echo $2
else 
 echo "No match"
fi

当我运行此操作时,我收到以下错误: -

man.sh: line 1: regex: command not found
man.sh: line 2: line: command not found

我是bash脚本新手。 任何人都可以帮我解决这个问题。 我只想写一个正则表达式来捕获commit

之后的单词

6 个答案:

答案 0 :(得分:1)

您不希望regex,您想要参数扩展/子字符串提取

line="commit 5456eee"
first="${line% *}"
regex="${line#* }"
if [[ $line =~ $regex ]] 
    then
    echo $2
else 
    echo "No match"
fi

$first == 'commit'$regex == '5456eee'。 Bash提供了您需要的所有工具。

答案 1 :(得分:1)

如果你真的只需要第二个单词,你也可以使用awk

line = "commit 5456eee"
echo $line | awk '{ print $2 }'

或者如果你有一个文件:

cat filename | awk '{ print $2 }'

即使它没有bash唯一的解决方案,awk应该出现在大多数Linux操作系统上。

答案 2 :(得分:0)

您应该删除等号周围的空格,否则bash认为您要使用regex=作为参数执行"commit\s+(.*)"命令。 然后你应该删除if条件中的空格并引用字符串:

$ regex="commit\s+(.*)"
$ line="commit 5456eee"
$ if [ "$line"=~"$regex" ]
> then
>   echo "Match"
> else 
>   echo "No match"
> fi
Match

答案 3 :(得分:0)

也许你没有用

开始你的剧本
#!/bin/sh

#!/bin/bash

定义您正在使用的语言......? 它一定是你的第一线。 然后要小心,空间在bash中是一致的。在你的"如果"声明,应该是:

if [ $line =~ $regex ]

检查一下并告诉我们更多关于你得到的错误的信息

答案 4 :(得分:0)

如果您将此脚本设置为test.sh

之类的文件

并执行:

test.sh commit aaa bbb ccc
   $0     $1    $2  $3  $4

你可以通过$ 0 $ 1 ...

得到足够的论据

答案 5 :(得分:0)

获得匹配的结果捕获组(如果有的话)的一种简单方法是使用BASH_REMATCH,将匹配结果放入其自己的数组中:

regex=$"commit (.*)"
line=$"commit 5456eee"
if [[ $line =~ $regex ]] 
then
 match=${BASH_REMATCH[1]}
 echo $match
else 
 echo "No match"
fi

由于您只有一个捕获组,因此它将在数组中定义为BASH_REMATCH[1]。在上面的示例中,我已将变量$match分配给返回的BASH_REMATCH[1]结果:

5456eee