相关疑难解决方法(0)

grep的基本表达式不支持\?

这不会产生任何输出.怎么会?

$ 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)

linux grep

105
推荐指数
2
解决办法
3万
查看次数

如何使用sed从字符串中提取文本?

我的示例字符串如下:

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)

regex bash sed

83
推荐指数
4
解决办法
19万
查看次数

有一种简单的方法可以将"原始"字符串传递给grep吗?

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来实现呢?

bash grep escaping command-line-interface

50
推荐指数
4
解决办法
4万
查看次数

为什么有这么多不同的正则表达式方言?

我想知道为什么必须有这么多正则表达方言.为什么它看起来像这么多语言,而不是重复使用一种经过验证的方言,似乎一心想写自己的语言.

像这些.

我的意思是,我知道其中一些确实有非常不同的后端.但是不应该从程序员那里抽象出来吗?

我更多地指的是奇怪但小的差异,比如括号必须用一种语言转义,但是在另一种语言中是文字.或者元字符意味着有些不同的东西.

是否有任何特殊原因我们不能为正则表达式提供某种普遍方言?我认为这对于那些必须使用多种语言的程序员来说会更容易.

regex

15
推荐指数
1
解决办法
1647
查看次数

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 ...

我做错了什么?

regex linux bash shell terminal

9
推荐指数
1
解决办法
7115
查看次数

简单的Bash和RegEx问题

我无法在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)

显而易见的是我错过了什么?

regex bash bash4

8
推荐指数
2
解决办法
1万
查看次数

Bash regex ungreedy匹配

我有一个应该在字符串中的多个位置匹配的正则表达式模式.我想将所有匹配组放入一个数组中,然后打印每个元素.

所以,我一直在尝试这个:

#!/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)

... 有任何想法吗?

regex bash regex-greedy

7
推荐指数
2
解决办法
1304
查看次数

什么\ W\D代表shell脚本?

在shell脚本中我们有\ t用于tab,\ s用于空格,\ w用于word.什么\W (capital W) and \D (capital D)用于?

regex shell

2
推荐指数
2
解决办法
2232
查看次数

正则表达式匹配但脚本意外失败?

我有这个正则表达式来匹配版本号:

^[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但没有运气。有什么建议 ?

regex bash

2
推荐指数
1
解决办法
85
查看次数