2012-10-13 17 views
1

我得到的字符串可以從零到多個前導和尾隨空格。如何確保在字符串和零空格之前恰好有2個空格

我試圖擺脫他們沒有很多hackery,但我的代碼看起來很大。

如何以乾淨的方式做到這一點?

+0

該字符串是否可以包含空格appart from trailing and leading ones? –

+0

當然,它可能包含很多「之間」的空間 –

回答

5

一樣容易:

$ src="  some text   " 

$ dst=" $(echo $src)" 

$ echo ":$dst:" 
: some text: 

$(echo $src)將擺脫所有的周圍空間。 比你只需在它之前添加多少空間。

+0

' $(echo $ src)'伎倆,我喜歡它!非常簡潔和穩定 –

+3

它會闖入任何內部空間。如果你沒有問題,反引號中的'echo'是多餘的。我會建議不要這種方法。 – tripleee

+0

爲了演示,您可以用'echo:「」$ src:'替換最後一行以獲得相同的效果。如果你有'src ='one two''有兩個空格,其中一個將會丟失。 – tripleee

1

你是怎麼叫出這個字符串的?如果它是一個回聲你可以把

Echo "<2 spaces>". "string"; 

,如果它是你只要把第一qoute和字符串之間的2個空格正常的字符串。使用GNU sed

"<2spaces> string here" 
1

方式一:

sed 's/^[ \t]*/ /; s/[ \t]*$//' file.txt 

你可以申請這一個bash變量是這樣的:

echo "$string" | sed 's/^[ \t]*/ /; s/[ \t]*$//' 

,並保存它是這樣的:

variable=$(echo "$string" | sed 's/^[ \t]*/ /; s/[ \t]*$//') 

說明:

第一個替換將刪除所有前導空白並將其替換爲兩個空格。 第二個替換將簡單地從行中刪除所有滯後的空白。

+0

謝謝,忘了提及我更喜歡純粹的打擊 –

+0

我會毫不猶豫地調用'sed' – Steve

1

最簡單的可能是使用外部進程。

value=$(echo "$value" | sed 's/^ *\(.*[^ ]\) *$/ \1/') 

如果你需要一個空字符串變換成兩個空間,你需要修改的正則表達式;如果你不在Linux上,你的sed方言可能會略有不同。爲了獲得最大的便攜性,請切換到awk或Perl,或者在Bash中完成所有操作。這會變得更復雜一些,但是一開始,trailing=${value##*[! ]}包含任何尾隨空格,您可以使用${value%$trailing}對其進行修剪,對於前導空格也是如此。有關詳細信息,請參閱Bash手冊中有關變量替換的部分。

0

您可以使用正則表達式來匹配前導空格和尾隨空格之間的所有內容。匹配的文本可在BASH_REMATCH數組中找到(匹配第一個括號組的文本位於元素1中)。

spcs='\ *' 
text='.*[^ ]' 
[[ $src =~ ^$spcs($text)$spcs$ ]] 
dst=" ${BASH_REMATCH[1]}" 
相關問題