2017-08-31 60 views
1

我有一個用例添加屬性::字段名稱[0-9] [0-9]:但一些字段已經有屬性::, 所以我只需要添加attribtue ::至名_ [0-9] [0-9]:那不跟屬性::sed替代與負面看法正則表達式

我已經試過這樣:

sed -n 's/name_[0-9][0-9]:(?!attribute::)/&attribute::/p' out 

我在網上正則表達式調試器測試正則表達式應該是我需要什麼,但實際上這不匹配,如果我給name_01:abc

+0

'sed'不使用PCRE,所以它沒有lookahead。 – Barmar

+0

@Barmar無論如何要實現這一目標? – michael

+0

如果您使用GNU'sed',我認爲您可以使用PCRE重新編譯它。去谷歌上查詢。 – Barmar

回答

1

「在線正則表達式調試器」通常不會告訴您他們測試哪種精確的正則表達式方言;如果他們告訴你,你需要知道你的sed支持哪種方言。

您正在嘗試使用我知道的任何sed開箱即用的Perl正則表達式功能,但當然,它在Perl中非常受支持。

perl -ne 's/name_[0-9][0-9]:(?!attribute::)/$&attribute::/ and print' out 
+0

是的,perl完美地解決了我的問題 – michael

1
$ cat file1 
name_12: 
name_34:attribute:: 
name_56: 

$ sed '/:attribute::/n; s/name_[0-9][0-9]:/&attribute::/g' file1 
name_12:attribute:: 
name_34:attribute:: 
name_56:attribute:: 

n:閱讀下一行。

+0

這不太精確,因爲它會在行中的任何位置查找':attribute ::'。 OP的問題看起來並不像這種情況那麼容易發生,但也許它應該被拼寫出來。 – tripleee