第一次出现单词后结束匹配-bash regex
你能帮我在bash中创建正确的正则表达式吗 我需要做的是从结构中提取每个表定义,如:第一次出现单词后结束匹配-bash regex,regex,bash,regex-group,Regex,Bash,Regex Group,你能帮我在bash中创建正确的正则表达式吗 我需要做的是从结构中提取每个表定义,如: OID: 123 Name: tab1 CREATE TABLE tab1 ( ... ); OID: 456 Name: tab2 CREATE TABLE tab2 ( ... ); OID: 789 Name: tab3 CREATE TABLE tab3 (
OID: 123
Name: tab1
CREATE TABLE tab1 (
...
);
OID: 456
Name: tab2
CREATE TABLE tab2 (
...
);
OID: 789
Name: tab3
CREATE TABLE tab3 (
...
);
准备一行格式:
OID: 123 Name: tab1 CREATE TABLE tab1 ( ... ); OID: 456 Name: tab2 CREATE TABLE tab2 ( ... ); OID: 789 Name: tab3 CREATE TABLE tab3 ( ... );
我必须获取单词Name
和OID
之间的所有文本。
我编写了一个简单的循环,为每个表名准备特定的正则表达式,但我在匹配方面有一个问题
对于每个表名,我的正则表达式如下所示:
(Name: tab2 .*?)( OID: .*)
#!/bin/bash
tables_definition=$(less tables_definition.txt)
regex="(Name: tab2 .*?)( OID: .*)"
if [[ $tables_definition =~ $regex ]];
then
object_definition="${BASH_REMATCH[1]}"
#do something
fi
我的结果是:
Name: tab2 CREATE TABLE tab2 ( ... )
我在在线regex模拟器中测试了上面的regex,它运行正常。我只是从完全匹配中提取第一组。
批处理正则表达式没有正确分组它。我想巴奇不知道?(前面元素的零次或一次出现)。我在bash中使用上述正则表达式没有结果
我的bash命令类似于:
(Name: tab2 .*?)( OID: .*)
#!/bin/bash
tables_definition=$(less tables_definition.txt)
regex="(Name: tab2 .*?)( OID: .*)"
if [[ $tables_definition =~ $regex ]];
then
object_definition="${BASH_REMATCH[1]}"
#do something
fi
请帮助。Bash的正则表达式不支持“节俭量词” 如何将
grep
与PCRE一起使用
grep -Po '(?<=Name: tab. ).*?(?= OID: .*|$)'
grep-Po'(?使用awk:
$ awk 'BEGIN{RS="";ORS=OFS=" "}{$1=$1;print}' file
OID: 123 Name: tab1 CREATE TABLE tab1 ( ... ); OID: 456 Name: tab2 CREATE TABLE tab2 ( ... ); OID: 789 Name: tab3 CREATE TABLE tab3 ( ... );
尾随换行符也丢失(由于ORS=“
)。如果需要,请将END{print”\n}
添加到程序末尾。一个Bash解决方案。输入文件包含一行格式的表定义(不一定):
第一个参数替换删除所有OID:xxx Name:tabx
,第二个参数替换在所有分号中添加换行符
输出:
CREATE TABLE tab1 ( ... );
CREATE TABLE tab2 ( ... );
CREATE TABLE tab3 ( ... );
如果输入文件不是一行程序,请使用
table_definition=$( cat table_definition2.txt | tr -d "\n" | tr -s ' ')
删除换行符并保留空格。你能发布你正在使用的bash命令吗?刚刚编辑了我的帖子*?
是个问题——POSIX ERE(bash的正则表达式所遵循的标准)没有非贪婪的全局变量。(regex引擎实际上并没有内置到bash中,而是由操作系统的C库提供的,因此不同平台的实现可能有所不同——但它使用的调用是实现ERE标准所必需的;任何附加的都是特定于平台的扩展)。谢谢你的回答@CharlesDuffy@MrF:我很想知道你的regex背景。从旧unix时代开始,只有Perlies才能使用*?
等,但现在人们一直在发布Qs,要求使用lookbehinds、非贪婪量词等*nix解决方案。你对regex的接触是什么,帮助你将regex作为bove?和往常一样,祝你好运解决你的问题!对我不起作用。我收到:pcregrep:命令行正则表达式偏移量31处出错:lookbehind断言不是固定长度的
而且,逐个获得这些定义很重要。这就是我将其放入循环的原因。@MrF:你可能在中使用了非固定长度(?