[英]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[*]}"
$ 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
將:
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
空白可以采用空格和制表符的形式。 盡管它們是非打印字符並且我們看不到,但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.