Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
第一次出现单词后结束匹配-bash regex_Regex_Bash_Regex Group - Fatal编程技术网

第一次出现单词后结束匹配-bash regex

第一次出现单词后结束匹配-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 (

你能帮我在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 ( ... );
我必须获取单词
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:你可能在
中使用了非固定长度(?