我是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
答案 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