2016-12-12 73 views
-1

我有我的配置文件中的行:這是有「physdev」字符串SED刪除圖案線條卻忽略註釋行以相同的模式

#-A FORWARD -i eth2 -j ACCEPT 
#-A FORWARD -m physdev --physdev-in eth0 -j DROP 
#-A FORWARD -m physdev --physdev-in eth2 -j DROP 
-A FORWARD -m physdev --physdev-in eth0 -j DROP 
-A FORWARD -m physdev --physdev-in eth2 -j DROP 
-A FORWARD -i br0 -j ACCEPT 
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT 

線是我的興趣,並想申請一個(SED)規則在這個文件,這樣規則必須忽略具有'physdev'字符串的註釋行並刪除具有'physdev'字符串的未註釋行。你能否建議一個sed刪除模式或任何awk模式。

+3

請添加您的嘗試,並解釋您在哪裏找到困難。 – nu11p01n73R

+0

幷包括輸入的實際預期輸出。並嘗試重新闡述你的要求 - 你使所有[雙重]否定的聲音變得複雜得多。注重簡單地陳述你想要**打印**(正面),而不是你想要刪除(負面),結果將是非常簡單的事情,比如'我想打印既不以#開始也不包含physdev的行「(如果這就是你想說的話,現在這個問題很模糊)。 –

回答

1

考慮:

$ cat file 
#-A FORWARD -i eth2 -j ACCEPT 
#-A FORWARD -m physdev --physdev-in eth0 -j DROP 
#-A FORWARD -m physdev --physdev-in eth2 -j DROP 
-A FORWARD -m physdev --physdev-in eth0 -j DROP 
-A FORWARD -m physdev --physdev-in eth2 -j DROP 
-A FORWARD -i br0 -j ACCEPT 
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT 

你可以這樣做:

$ awk '$1~/^#/{print; next} /physdev/{next} 1' file 
#-A FORWARD -i eth2 -j ACCEPT 
#-A FORWARD -m physdev --physdev-in eth0 -j DROP 
#-A FORWARD -m physdev --physdev-in eth2 -j DROP 
-A FORWARD -i br0 -j ACCEPT 
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT 
+0

非常感謝您的解決方案..它幫助了我很多。 – namus

1

所以,如果你想刪除所有未註釋行containig physdev(這是你想要的,對吧?),sed的至少優雅的AWK:

sed -e '/^[^#].*physdev/d' file 

如果要寫入文件中的變化,使用sed -i -e ...

+0

非常感謝您的解決方案..它幫助了我很多。 – namus

0

sed -e '/^#/n;/physdev/d' file

/^#/n只是前進到輸入的下一行whever一個符合#

這具有忽略所有後續sed命令時/^#/匹配的效果開始。所以如果你知道你總是希望保留所有以#開頭的行,使得/^#/n第一個命令會這樣做,無論後續命令有多少或多複雜。