2010-05-19 64 views
0

我想變換線,看起來像這樣:如何從字符串中刪除哈希值?

any text #any text# ===#text#text#text#===# 

到:

any text #any text# ===#texttexttext===# 

正如你可以看到上面我想刪除===#之間的#===# ,都應該被刪除#的數量可以是任何數量。

我能做到這一點與SED?

回答

2

試試這個:

sed 'h;s/[^=]*=*=#\(.*\)/\1/;s/\([^=]\)#/\1/g;x;s/\([^=]*=\+#\).*/\1/;G;s/\n//g' inputfile 

它分割線二在第一個「=#」,然後刪除所有「#」未通過「=」開頭,然後重新組合線。

讓我知道,如果有它特定的失敗案例。

編輯:

這個版本,這是越來越脆弱,爲您的新示例工作以及原:

sed 'h;s/[^=]*=[^=]*=*=#\(.*\)$/\1/;s/\([^=]\)#/\1/g;x;s/\([^=]*=[^=]*=\+#\).*/\1/;G;s/\n//g' inputfile 
+0

對我的例子很有效。我現在意識到,它必須允許=#發生在===之前# 像這樣: 任何文本=#任何文本#===#文本#文本#文本#===# 現在變成: 任何文本=#任何文本===#texttexttext ===# 但它應該成爲:' 任何文本=#任何#文本===#texttexttext ===# 是否有可能解決這個問題? – picknick 2010-05-19 12:20:35

+0

@ nimo9367:見我的編輯。 – 2010-05-19 13:46:51

+0

很好用!非常感謝你 – picknick 2010-05-19 14:00:36

1

sed的使用GNU BRE引擎(GNU基本正則表達式),不具有許多功能,「新的」正則表達式引擎有,比如環視這將是解決這一非常方便。

我想說你必須先匹配===#\(.\+\)===#(請注意,GNU BRE使用反斜槓來表示捕獲組和量詞,也不支持懶惰量詞)。然後取出捕獲組中發現的任何#(文字查找/替換就足夠了),然後把結果返回到字符串。但我不是一個Unix傢伙,所以我不知道在sed中是否可以做到這一點。

+0

這正是我想做的事情。 – picknick 2010-05-19 11:16:59