删除 Bash 中第一个空格右侧的字符

删除 Bash 中第一个空格右侧的字符
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

相关内容