我得到一个可以有从零到多个前导和尾随空格的字符串。
我试图摆脱它们而没有很多hackery,但我的代码看起来很大。
如何以干净的方式做到这一点?
一样容易:
$ src=" some text "
$ dst=" $(echo $src)"
$ echo ":$dst:"
: some text:
$(echo $src)
将摆脱所有周围的空间。比你简单地在它之前添加你需要多少空间。
你怎么调出字符串?如果它是一个回声,你可以放
Echo "<2 spaces>". "string";
如果它是一个普通字符串,你只需在第一个 qoute 和字符串之间放置 2 个空格。
"<2spaces> string here"
一种使用方式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]*$//')
解释:
第一次替换将删除所有前导空格并将其替换为两个空格。第二个替换将简单地从一行中删除所有滞后的空格。
最简单的可能是使用外部进程。
value=$(echo "$value" | sed 's/^ *\(.*[^ ]\) *$/ \1/')
如果您需要将一个空字符串转换为两个空格,则需要修改正则表达式;如果您不在 Linux 上,您的sed
方言可能会略有不同。为了获得最大的可移植性,请切换到awk
Perl,或者全部在 Bash 中完成。这有点复杂,但首先,trailing=${value##*[! ]}
它包含任何尾随空格,你可以用${value%$trailing}
, 修剪它们,前导空格也是如此。有关详细信息,请参阅 Bash 手册中有关变量替换的部分。
您可以使用正则表达式来匹配前导空格和尾随空格之间的所有内容。在BASH_REMATCH
数组中找到匹配的文本(匹配第一个括号组的文本在元素 1 中)。
spcs='\ *'
text='.*[^ ]'
[[ $src =~ ^$spcs($text)$spcs$ ]]
dst=" ${BASH_REMATCH[1]}"