1

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

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

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

4

5 回答 5

5

一样容易:

$ src="      some text          "

$ dst="  $(echo $src)" 

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

$(echo $src)将摆脱所有周围的空间。比你简单地在它之前添加你需要多少空间。

于 2012-10-13T12:40:56.653 回答
1

你怎么调出字符串?如果它是一个回声,你可以放

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

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

"<2spaces> string here"
于 2012-10-13T12:38:47.570 回答
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]*$//')

解释:

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

于 2012-10-13T12:39:55.480 回答
1

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

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

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

于 2012-10-13T12:46:14.043 回答
0

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

spcs='\ *'
text='.*[^ ]'
[[ $src =~ ^$spcs($text)$spcs$ ]]
dst="  ${BASH_REMATCH[1]}"
于 2012-10-13T13:43:25.813 回答