如何确保我之后在字符串和零空格之前有2个空格

时间:2012-10-13 12:36:44

标签: bash

我得到一个可以从零到多个前导和尾随空格的字符串。

我试图摆脱它们而没有太多的hackery,但我的代码看起来很大。

如何以干净的方式做到这一点?

5 个答案:

答案 0 :(得分:5)

一样简单:

$ src="      some text          "

$ dst="  $(echo $src)" 

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

$(echo $src)将摆脱所有空间。 而不是简单地添加你需要的空间。

答案 1 :(得分:1)

你怎么叫字符串?如果它是回声,你可以放

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

如果它是普通字符串,你只需在第一个qoute和字符串之间放置2个空格。

"<2spaces> string here"

答案 2 :(得分:1)

使用GNU sed的一种方式:

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

你可以将它应用于这样的bash变量:

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

并保存如下:

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

说明:

第一个替换将删除所有前导空格并将其替换为两个空格。 第二个替换将简单地从一行删除所有滞后的空格。

答案 3 :(得分:1)

最简单的可能就是使用外部流程。

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

如果需要将空字符串转换为两个空格,则需要修改正则表达式;如果你不在Linux上,你的sed方言可能略有不同。为了获得最大的可移植性,请切换到awk或Perl,或者在Bash中完成所有操作。这有点复杂,但首先,trailing=${value##*[! ]}包含任何尾随空格,您可以使用${value%$trailing}修剪它们,对于前导空格也是如此。有关详细信息,请参阅Bash手册中有关变量替换的部分。

答案 4 :(得分:0)

您可以使用正则表达式匹配前导和尾随空格之间的所有内容。匹配的文本位于BASH_REMATCH数组中(与第一个括号组匹配的文本位于元素1中)。

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