标签: pattern-matching

有没有办法让 find 使用 shell 的 extglob shell 选项?

简而言之,我本能地写了一个这样的命令来查找这两个文件prefix.extprefix_suffix.ext沿着层次结构向下查找

find /some/path -type f -name 'prefix?(_suffix).zip'
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

由于man find, under-name patter将模式称为“shell 模式”,因此我想知道是否可以控制应使用哪种模式,特别是是否extglob可以使用选项。

shell bash find pattern-matching

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

grep 具有不同数量的匹配组的多个模式?

我正在尝试统计 git diff 的插入和删除。

我有以下内容,当通过管道传输一个或多个形式的字符串时"4 files changed, 629607 insertions(+), 123 deletions(-)"可以计算总数:

grep -Eo 'changed, ?(\d+) insertion.*(\d+) deletion' | awk '{ i+=$2; d+=$4 } END { print "insertions: ",i," deletions: ",d }'
Run Code Online (Sandbox Code Playgroud)

这会产生insertions: 629607 deletions: 123

然而,有时 diff 并不遵循上述格式,而是只有插入或只有删除。

在这些情况下,我不需要匹配两个数字,而只需要匹配一个(并确保它最终出现在右列中)。

如何创建一个足够灵活的正则表达式来处理这些变化,并且生成可以awk正确计数的输出?

grep awk regular-expression pattern-matching

4
推荐指数
3
解决办法
665
查看次数

为什么这种电子邮件的正则表达式模式在它甚至不考虑小写字母的情况下如此受欢迎?

我已经看到以下模式在几个地方(甚至在 SOF 上)用作电子邮件 ID 验证的示例。

\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b
Run Code Online (Sandbox Code Playgroud)

以上摘自https://www.regular-expressions.info/tutorial.html,以及引用

 this pattern describes an email address. 
Run Code Online (Sandbox Code Playgroud)

这种模式不考虑小写字母(除非我遗漏了一些东西)。

我对这个模式有什么进一步的了解吗?由于这种模式不能真正用于生产?为什么如此受欢迎?

email regular-expression wildcards pattern-matching

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

具有双引号和由单引号包围的变量替换的 Grep 模式

所以,假设我有以下模式:

Thisisatest="1"
Run Code Online (Sandbox Code Playgroud)

在一个名为file.

我想匹配上面的确切字符串,无论出于何种原因,我选择循环列表中的一些数字,将它们用作变量并尝试执行以下操作:

Thisisatest="$varhere"
Run Code Online (Sandbox Code Playgroud)

上面$varhere等于上面的数字,是1。(虽然我提到了循环数字,但这只是一个未来可能的用例,仍然是一个例子)

现在为了让事情变得更简单,假设我想使用上述变量及其内容匹配上述精确模式:

grep 'Thisisatest="$varhere"' file
Run Code Online (Sandbox Code Playgroud)

其中文件包含字符串Thisisatest="1"$varhere包含数字1

问题是,这行不通,因为在单引号之间(如上)不会发生变量扩展。

这是反击失败的尝试:

  1. 从变量替换替换内容
echo "${varhere/[0-9]*/Thisisatest=\"$varhere\"}"
Run Code Online (Sandbox Code Playgroud)

在这里我echo用来查看它是否输出正确的字符串,以便它可以用作 grep 的输入......它输出这个:

'Thisisatest="'1'"
Run Code Online (Sandbox Code Playgroud)
  1. 添加更多报价
echo "'Thisisatest="${varhere}"'"
Run Code Online (Sandbox Code Playgroud)

输出:

'Thisisatest='1''
Run Code Online (Sandbox Code Playgroud)
echo ''''Thisisatest=\"${varhere}\"''''
Run Code Online (Sandbox Code Playgroud)

输出:

Thisisatest="'1'"
Run Code Online (Sandbox Code Playgroud)

其余的很明显......现在上面的最后一次尝试似乎接近我想要的,但仍然不是。

有什么办法可以做到以上几点?

grep quoting variable-substitution pattern-matching

3
推荐指数
1
解决办法
97
查看次数

使用 grep、awk 或 sed 查找与一种模式匹配但不与另一种模式匹配的文件

我需要找到.php.pl包含一个字符串(例如aaa)但包含另一个字符串(例如bbb)的文件。

我目前正在使用这个命令:

find /path/ \( -iname '*.php*' -or -name '*.pl*' \) -exec sh -c 'grep -l -v "aaa" {} | grep -l "bbb" {}' \; > resulttofile
Run Code Online (Sandbox Code Playgroud)

大约有 50 万个文件需要搜索,所以我想知道,

  • 如果我的命令正常工作 - 一些眼睛采样会给出积极的结果,
  • 如果可以使用某种其他形式变得更快(目前在虚拟机上大约需要 2 分钟,但将添加更多文件),或者使用awkorsed代替grep- 或者可能只是一种组合grep而不是两种。

该系统是 Debian GNU/Linux。

grep sed find awk pattern-matching

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

用于词干的 Grep 并仅打印单词(而不是行)

我正在尝试仅打印通过正则表达式找到的匹配单词。下面,我想要OPENSSL_NO_*源代码中存在的所有选项:

$ grep -IR OPENSSL_NO
fuzz/asn1.c:#ifndef OPENSSL_NO_RFC3779
fuzz/asn1.c:#ifndef OPENSSL_NO_RFC3779
fuzz/asn1.c:#ifndef OPENSSL_NO_CMS
fuzz/asn1.c:#ifndef OPENSSL_NO_DH
fuzz/asn1.c:#ifndef OPENSSL_NO_EC
fuzz/asn1.c:#ifndef OPENSSL_NO_RFC3779
fuzz/asn1.c:#ifndef OPENSSL_NO_OCSP
fuzz/asn1.c:#ifndef OPENSSL_NO_TS
fuzz/asn1.c:#ifndef OPENSSL_NO_DH
fuzz/asn1.c:#ifndef OPENSSL_NO_DSA
...
Run Code Online (Sandbox Code Playgroud)

当我尝试通过仅打印完整单词来修剪输出时:

$ grep -oIR "OPENSSL_NO*"
fuzz/asn1.c:OPENSSL_NO
fuzz/asn1.c:OPENSSL_NO
fuzz/asn1.c:OPENSSL_NO
fuzz/asn1.c:OPENSSL_NO
fuzz/asn1.c:OPENSSL_NO
...
Run Code Online (Sandbox Code Playgroud)

当我尝试 awk 时,它会打印整行:

$ grep -IR OPENSSL_NO | awk '/OPENSSL_NO[_A-Z0-9_]/{ print $0 }'
fuzz/asn1.c:#ifndef OPENSSL_NO_RFC3779
fuzz/asn1.c:#ifndef OPENSSL_NO_RFC3779
fuzz/asn1.c:#ifndef OPENSSL_NO_CMS
fuzz/asn1.c:#ifndef OPENSSL_NO_DH
fuzz/asn1.c:#ifndef OPENSSL_NO_EC
...
Run Code Online (Sandbox Code Playgroud)

和:

$ grep -IR OPENSSL_NO | awk '/\<OPENSSL_NO\>'
awk: line 1: runaway regular expression /\<OPENSSL_ ...
Run Code Online (Sandbox Code Playgroud)

和: …

text-processing pattern-matching

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

检查单词(值)是否在以逗号分隔的列表中

在下面的代码中,2不应与 匹配21,但它给出了“匹配”的结果。

如何检查SOURCE值是否在LIST?

LIST="1,21,3,4"
SOURCE="2"
if echo "$LIST" | grep -q "$SOURCE"; then
  echo "matched";
else
  echo "no match";
fi
Run Code Online (Sandbox Code Playgroud)

shell-script pattern-matching

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

为什么使用双括号“[[”检查通配符匹配的文件是否存在会失败,而使用单括号“[”可以?

假设我生成了两个目录,每个目录中都有文本文件,如下所示

mkdir "Directory1"
mkdir "Directory2"
touch "Directory1/fileclass1_"{1..5}".txt"
touch "Directory1/fileclass2_"{1..5}".txt"
touch "Directory2/fileclass1_"{1..5}".txt"
touch "Directory2/fileclass2_"{1..5}".txt"
Run Code Online (Sandbox Code Playgroud)

假设我通过执行以下操作来验证所有文件都在里面

A=( "Directory1" "Directory2" )
B=( "fileclass1" "fileclass2" )
for a in "${A[@]}"; do
    for b in "${B[@]}"; do
        for i in {1..5}; do
            name="${a}/${b}*${i}.txt"
            [[ ! -e $name ]] && echo "$name Does Not Exist"
        done
    done
done
Run Code Online (Sandbox Code Playgroud)

这返回

Directory1/fileclass1*1.txt Does Not Exist
Directory1/fileclass1*2.txt Does Not Exist
...
Run Code Online (Sandbox Code Playgroud)

但是,如果我用单括号替换双括号,我得到

A=( "Directory1" "Directory2" )
B=( "fileclass1" "fileclass2" )
for a in "${A[@]}"; do
    for b in "${B[@]}"; …
Run Code Online (Sandbox Code Playgroud)

shell bash wildcards test pattern-matching

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

匹配 if 条件中不区分大小写的模式

一个文件中可能有以下两种情况a.txt::

情况1:

V1=last  #case insensitive
V2=Last  #case insensitive
Run Code Online (Sandbox Code Playgroud)

案例2:

V1=last     #case insensitive
V2=LastNum  #case insensitive
Run Code Online (Sandbox Code Playgroud)

我需要检查两者是否V1V2任何给定时间都不相同。 V1并且V2也可以分配任何数字。

我正在使用下面的代码,但在第二种情况下失败:whenV1=lastV2=LastNum。情况 2 的预期输出是:Not Same

if [[ ( "${V1}" =~ [Ll][Aa][Ss][Tt] && "${V2}" =~ [Ll][Aa][Ss][Tt]$ ) || ( "${V1}" == "${V2}" ) ]];then
  echo "V1 and V2 are same"
else
  echo "Not Same"
fi
Run Code Online (Sandbox Code Playgroud)

非常欢迎任何帮助!提前致谢!

linux bash pattern-matching

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

sed 基于 2 个单词,然后用变量替换整行

我有一个txt文件,看起来像这样,

1:Ana:apple:08:00:wait
1:Joe:banana:08:30:wait
1:Oscar:orange:08:45:ready
1:Monica:apple:08:50:ready
1:Mark::orange:ready
Run Code Online (Sandbox Code Playgroud)

我必须找到只包含两个单词“banana”和“wait”的第一行,然后用$myvar替换整行

到目前为止我已经尝试过这段代码,但我认为我在同时匹配 2 个单词时遇到一些问题。

sed -i "0,/banana.wait/c\$myvar" myfile
Run Code Online (Sandbox Code Playgroud)

感谢任何可以帮助我的人

linux scripting bash sed pattern-matching

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