代码之家  ›  专栏  ›  技术社区  ›  J.Doe

sed命令:bash中的正则表达式,用于排除某些字符串

  •  1
  • J.Doe  · 技术社区  · 7 年前

    我想排除剪辑和日期中的所有内容,但选择所有其他数据。

    数据:

    02.04.2001 ERROR (User1) Server can't start
    01.02.2005 ERROR (User2) Server can't start
    07.08.2006 ERROR (User1) Problem with Login
    12.05.2009 ERROR (User2) Problem with Login
    

    ERROR  Server can't start
    ERROR  Server can't start
    ERROR  Problem with Login
    ERROR  Problem with Login
    

    我试过这样的东西 sed -n "s/^.*ERROR/ERROR/p"

    我不知道如何排除“(User)”字符串。

    4 回复  |  直到 7 年前
        1
  •  1
  •   John1024 David C. Rankin    7 年前

    尝试:

    $ sed -n "s/[^)]*ERROR ([^)]*)/ERROR/p" file
    ERROR Server can't start
    ERROR Server can't start
    ERROR Problem with Login
    ERROR Problem with Login
    

    ([^)]*) 它捕获用户字符串。

    以防万一 ERROR 从…起 .* [^)]* . 这会阻止正则表达式与任何 错误 字符串之后可能出现的字符串 (User1)

    请注意,前导 ^ .*ERROR 将始终从行的开头开始匹配。

        2
  •  0
  •   RomanPerekhrest    7 年前

    awk公司 :

    awk '{ $1=$3=""; sub(/^ */,"",$0) }1' file
    
    • $1=$3="" -清除第一个和第三个字段

    • sub(/^ */,"",$0)

    输出(如您所需的输出所示) 2.

    ERROR  Server can't start
    ERROR  Server can't start
    ERROR  Problem with Login
    ERROR  Problem with Login
    
        3
  •  0
  •   Ruslan Osmanov    7 年前

    我会用这样的东西:

    sed -E 's/^\S+\s+//; s/\(\S+\)//g; s/\s\s*/ /g' file
    

    • -E 选项启用 ERE syntax ;
    • s/^\S+\s+//
    • s/\(\S+\)//g 删除paren中的序列;
    • s/\s\s*/ /g

    测验

    $ cat sample 
    02.04.2001 ERROR (User1) Server can't start
    01.02.2005 ERROR (User2) Server can't start
    07.08.2006 ERROR (User1) Problem with Login
    12.05.2009 ERROR (User2) Problem with Login
    12.05.2009 ERROR (User2) Problem (sfsdfsdf(sdfsdf)sdfsf) with (another) aaa) Login
    12.05.2009 ERROR (User2) Problem with asdfsdf(sadfasdf) Login
    12.05.2009 ERROR (User2) Problem (sfsdfsdf(sdfsdf)sdfsf)aa with (another) aaa) Login
    
    $ sed -E 's/^\S+\s+//; s/\(\S+\)//g; s/\s\s*/ /g' sample
    ERROR Server can't start
    ERROR Server can't start
    ERROR Problem with Login
    ERROR Problem with Login
    ERROR Problem with aaa) Login
    ERROR Problem with asdfsdf Login
    ERROR Problem aa with aaa) Login
    

    使用Perl时几乎相同:

    perl -pe 's/^\S+\s+//; s/\(\S+\)//g; s/\s{2,}/ /g' file
    
        4
  •  0
  •   James Brown    7 年前

    在awk中。 gsub 本来会更容易,但我有理由使用 match 我忘了(:

    $ awk '
    {
        while(match($0,/(^| )(([0-9]{2}\.){2}[0-9]{4}|\([^)]*\))($| )/))
            $0=(RSTART==1?"":substr($0,1,RSTART)) substr($0,RSTART+RLENGTH)
    }1' file
    ERROR Server can't start
    ERROR Server can't start
    ERROR Problem with Login
    ERROR Problem with Login
    

    火柴 substr 在他们周围。