2016-06-21 34 views
0

我想創建SED的模式,這將查出「類型=‘’ 爲此,我嘗試使用模式同樣的模式和SED選擇不同的值

類型=」 *。 \?」

echo 'aa type="none" stretchChildren="first"' | sed s/'type=".*\?"'/hello/ 

以上是sed命令它打印

AA你好

這意味着它選擇了 '類型= 「無」 stretchChildren = 「第一」' 爲「類型= 「。* \?」'

下面是在相同字符串上使用相同模式的grep命令

echo 'aa type="none" stretchChildren="first"' | grep -oP 'type=".*?"' 

它使輸出

TYPE = 「無」

不知道我在sed模式很想念

可有一個人幫我在這裏 輸出的sed應該是

aa hello stretchCh ildren =「第一」

+2

你在哪個平臺上?你正在對'grep'和'sed'的方言進行不可移植的假設。它看起來好像你可能在Linux上或使用GNU'sed'和'grep',但也可以這麼說。 –

+2

爲什麼不使用簡單的模式:'type =「[^」] *「'在沒有額外選項的情況下,它將在'sed'和'grep'中起作用,並且做你想要的東西 –

回答

4

sed不具有非貪婪模式匹配,因此,使用*?*\?將不起作用。

如果你想有輸出作爲grep的相同,然後使用一組沒有" - [^"]+代替".*?"

sed -r 's/type="[^"]+"/hello/' 

[]是一組字符,^是否定,那麼[^"]指任何不是"的字符。

對於OSX使用-E而不是-r。 (-E也適用於最新的GNU sed,但它沒有記錄在--helpman sed中,所以我不推薦它)

+1

[^」] +這種模式下的含義是什麼 –

+1

除了''''「 –

+0

++以外至少有一個('+')所有字符的出現;如果使用'-E'而不是'-r',它也可以在OSX上工作(在這種情況下)。 – mklement0