我得到一个可以从零到多个前导和尾随空格的字符串。
我试图摆脱它们而没有太多的hackery,但我的代码看起来很大。
如何以干净的方式做到这一点?
答案 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]}"