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搜索文件中的字符串并获取相关值的主要内容,如果未能解决你的问题,请参考以下文章
我如何在linux / unix / bash脚本中搜索文件中的十六进制内容?