題 如何匹配sed中的空白?


我如何匹配sed中的空格?在我的數據中,我希望匹配所有3個以上的空白字符(製表空間)並將它們替換為2個空格。如何才能做到這一點?


192
2018-02-24 11:53


起源




答案:


角色類 \s 將匹配空白字符 <tab> 和 <space>

例如:

$ sed -e "s/\s\{3,\}/  /g" inputFile

將用兩個空格替換至少3個空格的每個序列。


備註: 對於POSIX合規性,請使用字符類 [[:space:]] 代替 \s,因為後者是GNU sed擴展。請參閱POSIX規範 SED 和 BREs裡面


200
2018-02-24 12:08



啊哈!這是失踪的-e開關讓我。 - sequoia mcdowell
我還必須添加'-r'開關,它允許擴展正則表達式使sed識別'\ s'作為空格。 - HUB
用Apple的 sed 我不得不使用 [[:space:]] 因為 \s 對我不起作用。也許 \s 是一個 GNU sed 延期? - Jared Beck
@JaredBeck謝謝,我的簡單正則表達式無法工作的想法已經用完了......這是蹩腳的,我認為是標準的擴展正則表達式..還 - -r不起作用-E做蹲 - Karthik T
感謝您的反饋。我用POSIX標準的鏈接更新了答案。 - mrucci


這適用於MacOS 10.8:

sed -E "s/[[:space:]]+/ /g"

55
2017-08-28 20:28



你知道這是否適用於所有Linux發行版? - amphibient
一般不是 GNU sed 不會有-E。從BSD sed手冊頁:“-E,-a和-i選項是非標準的FreeBSD擴展,可能在其他操作系統上不可用。” - Brad Koch
為什麼+運算符需要-E標誌?大多數表達式可能與*相反,然後這將適用於其他平台。 - Samuel
@Samuel如果你使用*,正則表達式將匹配零個或多個空格,你將在每個字符之間獲得一個空格,並在每一行的每一端都有一個空格。如果你沒有-E標誌,那麼你想要 sed "s/[[:space:]]\+/ /g" 匹配一個或多個空格。 - jbo5112
FWIW,NetBSD的sed支持 -E 國旗也是。 - mcandre


某些舊版本的sed可能無法將\ s識別為空格匹配令牌。在這種情況下,您可以使用'[XZ] [XZ] *'匹配一個或多個空格和製表符的序列,其中X是空格而Z是製表符。


13
2018-04-07 15:12



所以對於這裡的特殊需求,使用較舊的sed,你可以這樣做:$ sed's / [XZ] [XZ] [XZ] [XZ] * / / g'inputfile其中X是製表符,Z是空格。 - Marnix A. van Ammers


sed 's/[ \t]*/"space or tab"/'

8
2017-07-22 14:52



這保證適用於任何版本的 sed 在任何系統?如果沒有,可能值得一提的是,它的工作方式與其他答案類似,只是因為我們知道這些限制以及可能沒有預期結果的地方。 - Mokubai♦
這個RE是我用來匹配空格的東西。它比字符類更簡單,只是為了匹配製表符或空格。它只使用正則表達式的最基本約定,因此它應該可以在任何地方使用正則表達式的功能實現。 - Nate
在Mac 10.9.5上,這匹配空格和't'。我使用上面的Michael Douma來匹配空格字符(它也適用於-e)。 - Alien Life Form
在我的SUSE系統上不能正常工作。它匹配行上第一個有零個或多個空格的位置,它位於第一個字符之前。我懷疑這是預期的功能,當然不是請求的用例。我相信你想要改變'*'為'\ +'(或每個問題的'\ {3,\}')並且可以在sed命令的末尾添加一個g以匹配模式的所有出現。如果行中有空格的其他內容,也可能需要用[[:space:]]替換[\ t]。 - jbo5112