Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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
Regex 我怎样才能将只包含--------的行替换为|||_Regex_Sed_Awk - Fatal编程技术网

Regex 我怎样才能将只包含--------的行替换为|||

Regex 我怎样才能将只包含--------的行替换为|||,regex,sed,awk,Regex,Sed,Awk,我有点像: ------------------------------------------------------------------------ r2 | username | 2011-01-16 16:52:23 +0100 (Sun, 16 Jan 2011) | 1 line Changed paths: D /foo Removed foo ----------------------------------------------------------------

我有点像:

------------------------------------------------------------------------
r2 | username | 2011-01-16 16:52:23 +0100 (Sun, 16 Jan 2011) | 1 line
Changed paths:
   D /foo
Removed foo
------------------------------------------------------------------------
r1 | username | 2011-01-16 16:51:03 +0100 (Sun, 16 Jan 2011) | 1 line
Changed paths:
   A /foo
created foo
------------------------------------------------------------------------
我的目标是识别在特定日期由“用户名”添加的文件。因此,我需要有组合(用户名,2011年1月16日,A),以确保它是正确的文件,然后打印foo。 我的想法是:

  • 删除空白
  • 将换行符改为|
  • 去掉------------------并用换行符替换它们
  • 但问题是,我无法替换--------因为它们与其他字符混合在一起

    ----------------------------------------------------------------------
    |r2|username|2011-01-1616:52:23+0100(Sun,16Jan2011)|1line|Changedpaths:|D/foo|Removedfoo|
    ------------------------------------------------------------------------
    |r1|username|2011-01-1616:51:03+0100(Sun,16Jan2011)|1line|Changedpaths:|A/foo|createdfoo|
    ------------------------------------------------------------------------
    
    因此,我认为最好先用一个特殊字符(如| | | | | |等)替换----------------,然后使用awk FS=| | | OFS=\n换行符来更改这个字符 谁能帮帮我! 谢谢

    输出
    下面呢,

    
    #! /bin/sh
    
    if [ "$#" != '3' ] ; then
        echo "usage $0 logfile username date"
        exit 1
    fi
    
    cat "$1" | awk '
    BEGIN{
        FS="|";
    }
    
    /------------------------------------------------------------------------/{
        username="";
        date="";
        next;
    }
    
    /^r[0-9]+/{
        username = gensub(/^ *(.*[^ ]) *$/, "\\1", "", $2);
        date = gensub(/^ *(.*[^ ]) *$/, "\\1", "", $3);
        next;
    }
    
    /^created /{
        filename = gensub(/^created /, "", "", $0);
        if ( username == "'"$2"'" && date == "'"$3"'" ) {
            print filename;
        }
    }
    '
    
    如果对输入数据执行以下操作

    $ ./script data username '2011-01-16 16:51:03 +0100 (Sun, 16 Jan 2011)' $./脚本数据用户名'2011-01-16 16:51:03+0100(Sun,2011年1月16日)' 输出是

    foo 福 希望有帮助,
    -Luke

    如果你想用换行符替换
    -
    字符串,那么为什么不先用换行符替换它们而不是一个特殊字符?
    -+
    找到长破折号行,你能显示你的正则表达式吗?cat file.txt | awk'BEGIN{RS=”“;FS=“\n”}{print$i}awk'BEGIN RS=“\RS=“\n”{If($0~用户名){print$0}|tr-d | sed:a,;N、 美元!文学士;s/\n/|/g'@mimou好的,gensub需要
    gawk
    (GNU Awk)。“我会重写它,使它不再需要它。@mimou将答案更新为“不需要”
    gawk
    非常简洁,我是gusta。你没有像OFS一样在BEGIN之外抛出
    FS
    RS
    的任何原因?还有,
    RT
    是一种呆板主义吗?最后,它需要一点
    gsub
    love来满足“删除空格”的要求。OFS也可以在BEGIN内部。RT是一个呆滞的特性。至于删除空格,我没有达到这个要求。但我真的不明白他为什么要这么做。无论如何……如果需要删除空格,那么是的,一点gsub就可以了
    
    #! /bin/sh
    
    if [ "$#" != '3' ] ; then
        echo "usage $0 logfile username date"
        exit 1
    fi
    
    cat "$1" | awk '
    BEGIN{
        FS="|";
    }
    
    /------------------------------------------------------------------------/{
        username="";
        date="";
        next;
    }
    
    /^r[0-9]+/{
        username = gensub(/^ *(.*[^ ]) *$/, "\\1", "", $2);
        date = gensub(/^ *(.*[^ ]) *$/, "\\1", "", $3);
        next;
    }
    
    /^created /{
        filename = gensub(/^created /, "", "", $0);
        if ( username == "'"$2"'" && date == "'"$3"'" ) {
            print filename;
        }
    }
    '
    
    $ ./script data username '2011-01-16 16:51:03 +0100 (Sun, 16 Jan 2011)' foo