Bash:如何使用Regex搜索文件中的字符串并获取相关值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bash:如何使用Regex搜索文件中的字符串并获取相关值相关的知识,希望对你有一定的参考价值。

我有一个文件,其中包含一些模式和每个模式(正则表达式)的相应值,方式如下:

path                  group
/hello/get/**         @group1
/hey/get/you          @group2
/hi/get/ping_*.js     @group3
/hello/get/**         @group4

我想获得我给出的路径的相应组值。例如,如果我给“/hello/get/book.js”,我应该得到@ group1。

我怎样才能做到这一点?

我试过搜索正则表达式,但我不知道如何从文件中获取相应的组。此外,如果存在完全匹配但gregex匹配,则grep返回匹配行。例如,当我给

grep '/hey/get/you' FILENAME 

我得到以下输出:/ hey / get / you @ group2

但是,如果我给出以下内容:

grep '/hello/get/hello.js'

它不会返回任何东西。

字符串'/hello/get/hello.js'的预期结果应为@ group1,@ group4

答案

如果我正确理解了这个问题,你想要的代码将从文件中读取模式组对(例如'pattern_group_list.txt'),输入一个字符串(比如从命令行),并打印一个包含逗号的字符串 - 与文件中与其匹配的模式对应的组的分隔列表。如果是这种情况,请尝试以下代码:

#! /bin/bash

readonly kPATTERN_GROUP_FILE=pattern_group_list.txt

input=$1


    read -r pattern group || exit 0    # Skip the first line (header)
    result=
    while read -r pattern group ; do
        [[ $input == $pattern ]] && result+=$result:+,$group
    done
 <"$kPATTERN_GROUP_FILE"

printf '%s\n' "$result"
  • 代码不完全是Shellcheck-clean,因为$pattern没有引用[[ $input == $pattern ]],但引用它会破坏代码,防止匹配的glob模式。
  • 当使用参数'/ hey / get / you'运行时,它会打印'@ group2',并在使用参数'/hello/get/hello.js'运行时打印'@ group1,@ group4'。
  • 如果模式包含空格字符,则代码将不起作用。您需要不同的文件格式来支持此类模式。
  • 如果文件的最后一行未终止,则将错过文件中的最后一个模式组对。有关问题的解释,请参阅Read last line of file in bash script when reading file line by line,以及如果您担心这个问题,如何解决问题。
  • 如果文件为空,则代码会立即退出,状态良好。你可能想要在实际代码中做一些不同的事情。
  • 代码不会尝试为不存在或不可读的输入文件打印有用的错误消息。实用的代码可以处理这些错误。
  • Bash通常很慢。如果你有5k +模式匹配,不要指望能够在合理的时间内处理大量文件。我希望它可以忍受大约1k文件。除此之外,你真的需要使用更有效的编程语言。
另一答案

这不是正则表达式,而是扩展的全局,以便启用

shopt -s globstar

使用此扩展globs查找文件qazxsw poi的实现:

/tmp/test/hello/get/hello.js

awk -F/ 'BEGINOFS="/"NR>1$(NF)=""; print' /tmp/file |
    xargs -I% -n1 mkdir -p /tmp/test/%

创建文件

$ tree /tmp/test
/tmp/test
├── hello
│   └── get
├── hey
│   └── get
└── hi
    └── get

扩展动态全局匹配

touch /tmp/test/hello/get/hello.js

产量

$ awk 'NR>1print $1, $2' /tmp/file |
    while read r x; do
        stat /tmp/test$r &>/dev/null && echo $x
    done

DOC

@group1 @group4 man 7 glob

以上是关于Bash:如何使用Regex搜索文件中的字符串并获取相关值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 bash 中的任意数量的空格之后搜索和替换字符串?

我如何在linux / unix / bash脚本中搜索文件中的十六进制内容?

如何转义变量中的特殊字符以在 bash 中提供命令行参数

使用bash在changelog文件中读取文件直到regex

C# - RegEx - 获取两行之间的字符串

REGEX - 如何在文件名中找到两个连字符?