这不会产生任何输出.怎么会?
$ echo 'this 1 2 3' | grep '\d\+'
Run Code Online (Sandbox Code Playgroud)
但这些做到:
$ echo 'this 1 2 3' | grep '\s\+'
this 1 2 3
$ echo 'this 1 2 3' | grep '\w\+'
this 1 2 3
Run Code Online (Sandbox Code Playgroud) 我的示例字符串如下:
This is 02G05 a test string 20-Jul-2012
Run Code Online (Sandbox Code Playgroud)
现在从我想要提取的上面的字符串02G05
.为此我用sed尝试了以下正则表达式
$ echo "This is 02G05 a test string 20-Jul-2012" | sed -n '/\d+G\d+/p'
Run Code Online (Sandbox Code Playgroud)
但上面的命令没有打印任何东西,我相信它的原因是它无法匹配我提供给sed的模式.
所以,我的问题是我在这里做错了什么以及如何纠正它.
当我用python尝试上面的字符串和模式时,我得到了我的结果
>>> re.findall(r'\d+G\d+',st)
['02G05']
>>>
Run Code Online (Sandbox Code Playgroud) grep
从命令行使用时不能输入"原始"字符串,因为某些字符需要转义才能被视为文字.例如:
$ grep '(hello|bye)' # WON'T MATCH 'hello'
$ grep '\(hello\|bye\)' # GOOD, BUT QUICKLY BECOMES UNREADABLE
Run Code Online (Sandbox Code Playgroud)
我printf
用来自动转义字符串:
$ printf '%q' '(some|group)\n'
\(some\|group\)\\n
Run Code Online (Sandbox Code Playgroud)
这会生成字符串的bash-escaped版本,并且使用反引号,可以很容易地将其传递给grep调用:
$ grep `printf '%q' '(a|b|c)'`
Run Code Online (Sandbox Code Playgroud)
但是,它显然不适用于此:输出中的某些字符不会被转义,而有些则不必要.例如:
$ printf '%q' '(^#)'
\(\^#\)
Run Code Online (Sandbox Code Playgroud)
该^
传递给角色时,不应该逃脱grep
.
是否有一个cli工具,它接受一个原始字符串并返回一个bash-escaped版本的字符串,可以直接用作grep的模式?如果没有,我怎么能用纯粹的bash来实现呢?
我想知道为什么必须有这么多正则表达方言.为什么它看起来像这么多语言,而不是重复使用一种经过验证的方言,似乎一心想写自己的语言.
我的意思是,我知道其中一些确实有非常不同的后端.但是不应该从程序员那里抽象出来吗?
我更多地指的是奇怪但小的差异,比如括号必须用一种语言转义,但是在另一种语言中是文字.或者元字符意味着有些不同的东西.
是否有任何特殊原因我们不能为正则表达式提供某种普遍方言?我认为这对于那些必须使用多种语言的程序员来说会更容易.
所以我有这个功能
function test(){
local output="CMD[hahahhaa]"
if [[ "$output" =~ "/CMD\[.*?\]/" ]]; then
echo "LOOL"
else
echo "$output"
fi;
}
Run Code Online (Sandbox Code Playgroud)
但是,在命令行中执行测试会输出$ output而不是"LOOL",尽管模式应匹配$ output ...
我做错了什么?
我无法在bash 4.1中使用正则表达式来正确匹配模式.我已经阅读了有关引号与引号差异的一些信息,但我不认为这是我的问题.
我的目标是检查并确保脚本提供有效的ID.在这种情况下,有效ID是9位数的字符串.据我所知,正则表达式是\ d {9}.鉴于这是我要检查的代码片段:
id=$1
if [[ $id =~ \d{9} ]]; then
echo "This is a vaild ID"
else
echo "This is not a vaild ID"
fi
Run Code Online (Sandbox Code Playgroud)
然后调用脚本:
./script 987654321
Run Code Online (Sandbox Code Playgroud)
显而易见的是我错过了什么?
我有一个应该在字符串中的多个位置匹配的正则表达式模式.我想将所有匹配组放入一个数组中,然后打印每个元素.
所以,我一直在尝试这个:
#!/bin/bash
f=$'\n\tShare1 Disk\n\tShare2 Disk\n\tPrnt1 Printer'
regex=$'\n\t(.+?)\\s+Disk'
if [[ $f =~ $regex ]]
then
for match in "${BASH_REMATCH[@]}"
do
echo "New match: $match"
done
else
echo "No matches"
fi
Run Code Online (Sandbox Code Playgroud)
结果:
New match:
Share1 Disk
Share2 Disk
New match: Share1 Disk
Share2
Run Code Online (Sandbox Code Playgroud)
预期的结果将是
New match: Share1
New match: Share2
Run Code Online (Sandbox Code Playgroud)
我认为它不起作用,因为我.+?
匹配贪婪.所以我查看了如何使用bash正则表达式实现这一点.但是每个人似乎都建议在perl正则表达式中使用grep.
但肯定还有另一种方式.我想的可能是[^\\s]+
......但是输出的结果是:
New match:
Share1 Disk
New match: Share1
Run Code Online (Sandbox Code Playgroud)
... 有任何想法吗?
在shell脚本中我们有\ t用于tab,\ s用于空格,\ w用于word.什么\W (capital W) and \D (capital D)
用于?
我有这个正则表达式来匹配版本号:
^[1-9]\d{0,1}\.(?!0\d)\d{1,3}\.(?!0\d)\d{1,4}$
Run Code Online (Sandbox Code Playgroud)
在RegexChecker上检查时,正则表达式本身可以工作并匹配“1.0.0” 但是,当我尝试将相同的正则表达式包装在 bash 脚本中时,我的代码进入“else”状态。我不明白为什么?
#!/bin/bash
VERSION='1.0.0'
MATCH_PATTERN='^[1-9]\d{0,1}\.(?!0\d)\d{1,3}\.(?!0\d)\d{1,4}$'
if [[ $VERSION =~ $MATCH_PATTERN ]]; then
:
else
echo "Version number format is wrong."
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
我尝试使用调试器运行set -x
但没有运气。有什么建议 ?