[英]Using sed/awk to print lines with matching pattern OR another matching pattern
[英]printing lines based on pattern matching in multiple fields using awk
假設我有一個類似html的輸入
<li>this is a html input line</li>
我想從以<li>
開始並以</li>
結束的文件中過濾所有這些輸入行。 現在,我的想法是使用以下awk命令在第一個字段中搜索模式<li>
在最后一個字段中搜索模式</li>
awk '$1 ~ /\<li\>/ ; $NF ~ /\</li\>/ {print $0}'
但似乎沒有規定一次匹配兩個字段,或者我在語法上犯了一些錯誤。 你能在這里幫我嗎?
PS:我正在使用Solaris SunOS計算機。
Solaris上的腳本有很多錯誤:
awk '$1 ~ /\<li\>/ ; $NF ~ /\</li\>/ {print $0}'
/usr/xpg4/bin/awk
。 還有nawk
但它有更少的POSIX功能(例如,用於字符類不支持)。 \\<...\\>
是gawk特定的單詞邊界。 Solaris上沒有awk可以識別這些。 如果您只是想獲取文字字符,則無需轉義它們,因為它們不是正則表達式元字符。 &&
放在兩者之間,而不是;
這只是語句終止符來代替換行符。 {print $0}
因此您無需顯式編寫該代碼。 /
是awk正則表達式分隔符,因此您確實需要在正則表達式中間進行轉義。 $1
和$NF
將是<li>this
和line</li>
,而不是<li>
和</li>
。 因此,如果由於某種原因DID比較多個字段,則可以執行以下操作:
awk '($1 ~ /^<li>.*/) && ($NF ~ /.*<\/li>$/)'
但這可能是您真正想要的:
awk '/^<li>.*<\/li>/'
在這種情況下,您可以使用grep:
grep '^<li>.*</li>'
為什么不使用正則表達式來匹配行的開頭和結尾,例如
awk '/^[[:space:]]*<li>.*<\/li>[[:space:]]*$/ {print}'
盡管通常來說,如果您要處理HTML,最好使用專門設計用於處理HTML的工具。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.