2013-03-01 47 views
1

有沒有人知道如何匹配sed每個'foo'實例,當它在下面的字符串中'bar'後面?如何加密一個字符串,當沒有跟隨另一個sed

「富         噓聲        FOO     FOO          酒吧FOO       FOO                富 '

期望的結果(以粗體匹配實例)

' 匹配          噓聲         匹配     FOO          酒吧匹配       匹配                 匹配'

測試一個很大的數目後,我發現:

sed -e "s/foo\(*\)bar/FOO\1BAR/g" -e "s/foo/MaTcHeD/g" -e "s/FOO\(*\)BAR/foo\1bar/g" 

它首先與'foo bar'實例匹配,並用一些臨時字符串(這裏是'FOO BAR')替換它們,然後在將'foo bar'實例替換爲原始實體之前匹配靜態'foo'實例版本......(我希望我很清楚......)

但是,無論如何,這是不乾淨的。即使我目前還沒有找到它,我也會感到驚訝的是,沒有更直接的方法來做到這一點。

任何提示,將不勝感激。 :-)

非常感謝你,

+0

與常規分隔字符串?例如空間或標籤?我的意思是,'foo酒吧'部分有固定的空間嗎? – Kent 2013-03-01 15:08:33

+0

是必須的嗎? – Kent 2013-03-01 15:12:31

+0

分隔符包含可變數量的空格(但僅限空格)。 只要我可以用別的東西替換匹配的事件,但不修改空格字符分佈,Sed就不是必須的。 – taalf 2013-03-01 15:19:27

回答

0

,如果你要堅持sed,你的想法是好的。但是,如果原始字符串有FOO BAR,則說明您的解決方案失敗。您必須始終選擇正確的臨時字符串。它使你的腳本不安全。

您可以通過不選擇普通字符串作爲臨時字符串來改善它,但那些隱形字符串。

例如,該行工作:

sed -r 's/foo(*)bar/\x94\1\x98/g; s/foo/Matched/g;s/\x94(*)\x98/foo\1bar/g' file 
+0

年!非常感謝你:)你拿起了我的解決方案的確切問題。 – taalf 2013-03-01 15:29:04

+0

嗯,我不知道你爲什麼選擇精確的x94和x98,但似乎可以使用從x80到xFF的所有字符,即屬於擴展ASCII表的那些字符。再次感謝:-) – taalf 2013-03-01 15:49:32

+0

@taalf沒有特別的原因,因爲我在9之後按了4和8. :) – Kent 2013-03-01 16:03:33

相關問題