![删除 Bash 中第一个空格右侧的字符](https://linux22.com/image/131375/%E5%88%A0%E9%99%A4%20Bash%20%E4%B8%AD%E7%AC%AC%E4%B8%80%E4%B8%AA%E7%A9%BA%E6%A0%BC%E5%8F%B3%E4%BE%A7%E7%9A%84%E5%AD%97%E7%AC%A6.png)
2492 some string continues here
我想将其转换为
2492
在巴什中。我该怎么办呢?
这感觉很接近,但不起作用:
var="2492 some string continues here "
echo ${var%[[:space:]]*}
答案1
因为有多个空间你想使用
${var%%[[:space:]]*}
# ...^^
删除最长以空格开头的尾随子字符串
只需使用一个空格,%
您就可以删除后跟零个或多个字符的最短空格序列,这只是字符串中的最后一个空格。
$ echo ">$var<"; echo ">${var%[[:space:]]*}<"; echo ">${var%%[[:space:]]*}<"
>2492 some string continues here <
>2492 some string continues here <
>2492<
如果您只是在寻找第一个字, 你可以这样做:
read -r word rest_of_string <<<"$var"
echo "I have: $word"
假设您没有更改 IFS 变量,这将处理前导空格。
答案2
有一个简单的解决方案,即使用%%
( ${var%% *}
) 代替%
( ${var% *}
)。这将删除*
初始空格后的所有内容 ( )。
$ var='2492 some string continues here'
$ echo "${var%% *}"
2492
但如果 var 中的字符串有任何前导空格,那么就会失败。可以使用以下方法删除前导空格:
$ var=$' \t 2492 some string continues here '
$ var="${var#"${var%%[![:space:]]*}"}"
$ echo "$var"
2492 some string continues here
$ echo "${var%%[[:space:]]*}"
2492
即使空格是空格制表符 NL 或 CR,这也有效。
正则表达式
也许更强大的解决方案是使用正则表达式:
$ var=$' \t 2492 some string continues here '
$ regex='^[[:space:]]*([^[:space:]]+)'
$ [[ $var =~ $regex ]] && var=${BASH_REMATCH[1]}
$ echo "$var"
2492
答案3
您还可以使用简单的工具cut
,它根据分隔符剪切字符串:
echo "$mystring" | cut -d' ' -f 1
在哪里 :
-d' '
将分隔符设置为空格-f 1
给出第一个字段(基于分隔符)
答案4
要仅使用 bash 和内置命令,您可以使用内部字段分隔符(IFS)和 数组
set -f # To prevent filename globbing when creating the array, as pointed out by Kusalananda in the comments
array=(2492 some string continues here)
set +f # enable it again
IFS=" "
echo "${array[0]}"
unset IFS