簡體   English   中英

更改grep命令的定界符

[英]Change delimiter of grep command

我正在使用grep檢測<a href="xxxx"> something here </a>
當鏈接在輸入中分為兩行時,此功能不起作用。 我想讓grep檢查直到它檢測到</a>但是現在它只是將輸入輸入到grep中,直到檢測到新行。

因此,如果輸入類似於<a href="xxxx"> something here </a>則可以使用,但是如果輸入類似於

<a href="xxxx">

something here /a>    

,但事實並非如此。 有什么辦法嗎?

我會用awk而不是grep。 這應該工作:

awk '/a href="xxxx">/,/\\/a>/' filename

我認為使用某些xslt工具會減少很多麻煩,但是您可以使用sed,awk或grep pcregrep的擴展版本(具有多行模式(-M))來完成此操作。

我建議折疊輸入,以便打開和關閉標簽在同一行,然后根據模式檢查行。 使用sed (1)的慣用方法:

sed '/<[Aa][^A-Za-z]/{ :A
     /<\/[Aa]>/ bD
     N
     bA
     :D
     /\n/ s// /g
}
# now try your pattern
/<[Aa][^A-Za-z] href="xxx"[^>]*>[^<]*something here[^<]*<\/[Aa]>/ !d'
perl -e '$_=join("", <>); m#<a.*?>.*?<.*?/a>#s; print "$&\n";'

因此,這里的技巧是將整個輸入讀入$ _。 然后運行標准的/.../正則表達式。 我使用了替代語法m#...#,以便不必在XML中反斜杠“ /”。 最后,“ s”后綴通過使“”來使多行匹配有效。 還匹配換行符(另請注意選項“ m”會更改^和$的含義)。 “ $&”是匹配的字符串。 這是您要尋找的結果。 如果只需要內部文本,則可以在該部分周圍放置圓括號並打印$ 1。

我假設您的意思是</a>而不是/a>作為xml結束分隔符。

注意.*? .*的非貪婪版本,因此對於<a>1</a><a>2</a> ,它僅匹配<a>1</a>

請注意,嵌套節點可能會引起問題,例如<a><a></a></a> 這與嘗試匹配嵌套括號“(”,“)”或“ {”,“}”時相同。 這是一個更有趣的問題。 正則表達式通常是無狀態的,因此它們本身並不支持保持無限的嵌套嵌套深度。 在對解析器進行編程時,通常使用正則表達式進行低級字符串匹配,而將其他內容用於令牌的高級解析,例如bison。 有許多語言的野牛語法,可能還有xml。 xslt可能更好,但我並不熟悉。 但是對於一個非常簡單的用例,您還可以在perl中處理這樣的嵌套塊:

嵌套的括號處理代碼:(可以很容易地修改為處理嵌套的xml塊)

$_ = "a{b{c}e}f";

my($level)=(1);
s/.*?({|})/$1/; # throw away everything before first match
while(/{|}/g) {
   if($& eq "{") {
      ++$level;
   } elsif($& eq "}") {
      --$level;
      if($level == 1) {
         print "Result: ".$`.$&."\n";
         $_=$'; # reset searchspace to after the match
         last;
      }
   }
}

Result: {b{c}e}

考慮egrep -3 '(<a|</a>)'

“ -3”在每個正則表達式匹配項周圍最多打印3條周圍的線(匹配項前3行和匹配項后3行)。 如果效果更好,也可以使用-1或-2。

這可能是一個重復的問題: Grep搜索帶有換行符的字符串

如果您只需要查找文件而不是行號,則可以按照答案之一中的解釋,使用tr '\\n' ' '命令嘗試該命令。

暫無
暫無

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

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