2015-05-04 43 views
3

我想搜索 - 在bash命令行中替換包含空格的東西,並且我認爲sed是最簡單的方法。sed(在bash中)與[ t]一起使用,但與 s不兼容?

使用[ \t]表示任一選項卡或空間,以匹配空格,按預期工作:

echo "abc xyz" | sed "s/[ \t]xyz/123/" 
abc123 

但使用的\s代替[ \t]沒有,讓我吃驚:

echo "abc xyz" | sed "s/\sxyz/123/" 
abc xyz 

我對於bash來說是相當新的,所以我可能會錯過一些微不足道的東西,但不管我做什麼,我都無法讓它工作。使用\\s而不是\s,使用單引號('而不是"),將空白標記放在方括號內(如[\s]或甚至[\\s]),似乎沒有任何幫助..?

(編輯)如果它不同於一個sed/bash版本到另一個:我在這裏工作的OS X。

此外,我注意到,當我在[ \t]空白部分後添加+,有選擇地搶多個空格/製表符如果存在的話,它不工作要麼...?

echo "abc xyz" | sed "s/[ \t]+xyz/123/" 
abc xyz 

(又一遍,也試圖與\+代替+,和單引號代替雙引號,沒有什麼幫助)

+3

有趣和相關:[?如何匹配在sed空格]( http://superuser.com/a/112837/204979)。基本上,對於POSIX合規性來說,使用字符類[[:space:]]而不是\ s,因爲後者是GNU sed extension_因此,您可能正在使用非GNU'sed'。你能提供'sed --version'的輸出嗎?這裏sed上的 – fedorqui

+0

,它按預期工作;作爲@fedorqui建議,它確實是gnu sed –

+0

您是否已經徹底閱讀了系統上的sed手冊頁?它應該記錄什麼工作,哪些不工作。在命令提示符下鍵入'man sed'。 –

回答

4

作爲超級用戶的How to match whitespace in sed?看出:

POSIX標準,使用字符類[[:space:]]而不是 \ s,因爲後者是GNU sed擴展

所以你可能運行的是非GNU sed版本,因此\s不適用於你。

有兩種解決方法:

  • 要使用(空間)和\t在一起,就像你在幹什麼。
  • 使用[[:space:]]
+0

確認,謝謝,它適用於[[:space:]] 但是,+修飾仍然不會沒有工作,有什麼想法? 請注意''[[:space:]] \ {1,999 \}'* does *工作,但'[[:space:]] +'或'[[:space:]] \ +'不。 – RocketNuts

+1

要正常使用'+',您需要將其轉義:'\ +'或使用'-r'作爲擴展正則表達式:'sed -r「s/[[:space:]] +/X /」' – fedorqui

+2

@RocketNuts [符合POSIX的語法](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_06)for _one或更多matches_是'\ {1,\}' - 其他任何東西都是一個擴展。 –

1
echo 'abc xyz<>abcxyz' | sed 's/[[:space:]]xyz/123/g' 
abc123<>abcxyz 
echo 'abc xyz<>abcxyz' | sed "s/[[:space:]]xyz/123/g" 
abc123<>abcxyz 

不會對工作很老的SED的版本,但罰款GNU的sed爲POSIX投訴(AIX,...)

相關問題