簡體   English   中英

如何刪除bash中的多余空格?

[英]How to remove extra spaces in bash?

如何刪除變量HEAD中的多余空格?

HEAD="    how to  remove    extra        spaces                     "

結果:

how to remove extra spaces

嘗試這個:

echo "$HEAD" | tr -s " "

或者你想把它保存在一個變量中:

NEWHEAD=$(echo "$HEAD" | tr -s " ")

更新

要刪除前導和尾隨空格,請執行以下操作:

NEWHEAD=$(echo "$HEAD" | tr -s " ")
NEWHEAD=${NEWHEAD%% }
NEWHEAD=${NEWHEAD## }

使用 awk:

$ echo "$HEAD" | awk '$1=$1'
how to remove extra spaces

利用不引用變量的分詞效果

$ HEAD="    how to  remove    extra        spaces                     "
$ set -- $HEAD
$ HEAD=$*
$ echo ">>>$HEAD<<<"
>>>how to remove extra spaces<<<

如果您不想使用位置參數,請使用數組

ary=($HEAD)
HEAD=${ary[@]}
echo "$HEAD"

不引用的一個危險副作用是文件名擴展將起作用。 所以先關閉它,然后重新啟用它:

$ set -f
$ set -- $HEAD
$ set +f

這匹馬還沒有死:讓我們繼續擊敗它!*

讀入數組

其他人提到了read ,但由於使用不帶引號的擴展可能會導致不受歡迎的擴展,因此所有使用它的答案都可以被視為或多或少相同。 你可以做

set -f
read HEAD <<< $HEAD
set +f

或者你可以做

read -rd '' -a HEAD <<< "$HEAD"  # Assuming the default IFS
HEAD="${HEAD[*]}"

帶參數擴展的擴展 Globbing

$ shopt -s extglob
$ HEAD="${HEAD//+( )/ }" HEAD="${HEAD# }" HEAD="${HEAD% }"
$ printf '"%s"\n' "$HEAD"
"how to remove extra spaces"

*實際上沒有馬受到傷害——這只是一個比喻,讓一個簡單的問題得到六個以上不同的答案。

以下是我將如何使用 sed:

string='    how to  remove    extra        spaces                     '
echo "$string" | sed -e 's/  */ /g' -e 's/^ *\(.*\) *$/\1/'

=> how to remove extra spaces   # (no spaces at beginning or end)

第一個 sed 表達式用單個空格替換任何超過 1 個空格的組,第二個表達式刪除任何尾隨或前導空格。

echo -e " abc \\t def "|column -t|tr -s " "

column -t將:

  1. 刪除行首和行尾的空格
  2. 將制表符轉換為空格

tr -s " "將多個空格壓縮到單個空格


順便說一句,要查看整個輸出,您可以使用cat - -A :顯示所有空格字符,包括制表符和 EOL:

echo -e " abc \\t def "|cat - -A

輸出: abc ^I def $

echo -e " abc \\t def "|column -t|tr -s " "|cat - -A

輸出: abc def$

試試這個:

echo '    how to  remove    extra        spaces                     ' | sed 's/^ *//g' | sed 's/$ *//g' | sed 's/   */ /g'

或者

HEAD="    how to  remove    extra        spaces                     "
HEAD=$(echo "$HEAD" | sed 's/^ *//g' | sed 's/$ *//g' | sed 's/   */ /g')

不帶引號的 echo 變量可以滿足您的需求:

HEAD="    how to  remove    extra        spaces      "
echo $HEAD

# or assign to new variable
NEW_HEAD=$(echo $HEAD)
echo $NEW_HEAD

輸出: how to remove extra spaces

我會使用tr刪除多余的空格,並使用xargs修剪前后。

TEXT="     This          is  some                             text   "
echo $(echo $TEXT | tr -s " " | xargs)

# [...]$ This is some text

空白可以采用空格制表符的形式。 盡管它們是非打印字符並且我們看不到,但sed和其他工具將它們視為不同形式的空白,並且只對您要求的內容進行操作。 即,如果您告訴sed刪除 x 個空格,它會這樣做,但表達式將不匹配tabs 反之亦然 - 向sed提供一個制表符,它不會匹配空格,即使它們的數量等於一個制表符中的空格

一個更可擴展的解決方案將用於以空格制表符的形式刪除任何一個/兩個額外的空間(我已經測試過在您的樣本變量中混合兩者)是:

echo $HEAD | sed 's/^[[:blank:]]*//g'

或者我們可以收緊@Frontear 的極好建議,即在沒有tr情況下使用xargs

echo $HEAD | xargs

但是,請注意xargs也會刪除換行符。 因此,如果您要cat一個文件並將其通過管道傳輸到xargs ,則所有額外的空間(包括換行符)都將被刪除,並且所有內容都放在同一行;-)。

在我的測試中,上述兩者都達到了您想要的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM