2015-12-19 32 views
1

我想用sed中的正則表達式替換字符串。現在,我知道sed的行爲在Mac上很時髦。我經常看到使用egrep的解決方法,當我想檢查一行中的某個模式時。但是,在這種情況下,我想做字符串替換。如何讓sed獲取擴展正則表達式?

我想用gggg代替cp ancp <tab or newline> an。我嘗試了以下,這將在擴展的正則表達式下工作:

sed -i'_backup' 's/cp\s+an/gggg/g' 

但是,當然這沒有什麼。我嘗試了egrep ping,當然它用cp <one or more space characters> an挑出了一行。

如何獲得sed使用擴展正則表達式進行替換?或者什麼是使用正則表達式進行替換的更好方法?

我在mac osx上。

+1

安裝GNU coreutils可讓您訪問GNU sed。 'brew install coreutils'如果你已經有了Homebrew的話。 –

+0

這個Q可能更適合於相關網站http://apple.stackexchange.com(AskDifferent)。考慮使用Q底部的'flag'鏈接並請主持人將其移動到那裏。祝你好運。 – shellter

+0

[sed'的手冊頁](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/sed.1.html)在一段標題爲「Sed Regular表達式」。它鏈接到[re_format手冊頁](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man7/re_format.7.html),它解釋了「現代」(又名「擴展」)正則表達式。 –

回答

1

在OSX下面的命令將延長正則表達式的支持工作:

sed -i.backup -E 's/cp[[:blank:]]+an/gggg/g' 

POSIX Character Class Reference

+0

好的,我會試試這個。我在哪裏可以找到'[[空白]]'等文件? – Hunle

+0

在回答POSIC字符類時添加了參考。 – anubhava

1

既然你提到你想<newline>要處理,你需要哄的sed了一下。您的具體要求是不是太清楚,我,但下面的例子說明了中美戰略經濟對話可以很容易地處理某些案件中,一個換行符是在「目標」正則表達式:

$ echo $'cp\nancp an' | sed -E '/cp/{N; s/cp(\n|[[:blank:]])an/gggg/g;}' 
gggggggg 

(注意非Mac的讀者:如果您的grep不支持-E,請嘗試使用-r。)