簡體   English   中英

sed命令:bash中的正則表達式可排除某些字符串

[英]sed command: regex in bash to exclude certain strings

我想排除剪輯和日期中的所有內容,但選擇所有其他數據。

數據:

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)”字符串。

嘗試:

$ 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可能在一行中出現多次,我們將ERROR之前的正則表達式從.*更改為[^)]* 這樣可以防止正則表達式與(User1)字符串之后可能出現的任何ERROR字符串匹配。

注意,前導^是不必要的。 Sed的正則表達式匹配最左邊最長的匹配。 這意味着.*ERROR將始終從行首開始匹配。

只需使用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

我會用這樣的東西:

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

哪里

  • -E選項啟用ERE語法
  • s/^\\S+\\s+//刪除非空白字符,然后刪除一個或多個空白字符(即日期和其后的空格);
  • s/\\(\\S+\\)//g刪除括號中的序列;
  • 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

在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

它搜索(給定的)具有match (不是我們所有人:)的日期,並在它們周圍用括號括起來的字符串和substr

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM