Удалите символы справа от первого пробела в Bash

Согласно тому, что у меня есть в моем .bashrc , вам понадобится что-то вроде

bind '"\e[6~": history-search-forward'
7
13.04.2018, 15:35
6 ответов

Поскольку есть несколько пробелов, которые вы хотите использовать

${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.

15
27.01.2020, 20:14

Существует простое решение — использовать%%(${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
27.01.2020, 20:14

Если вы не возражаете против внешнего вызова, используйте awk или sed:

$ string="first second third fourth"
$ echo "${string}" | awk '{print $1}' # will work even with tabs
first
$ echo "${string}" | sed -e "s/.*$//" # will fail on leading whitespace
first
0
27.01.2020, 20:14

Чтобы использовать только 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
0
27.01.2020, 20:14

Вы также можете использовать простой инструмент cut, который вырезает строки на основе разделителя:

echo "$mystring" | cut -d' ' -f 1 

Где:

  • -d' 'устанавливает разделитель пробелом
  • -f 1дает первое поле (на основе разделителя)
2
27.01.2020, 20:14

Вы можете использовать собственные операции со строками оболочки:

TEST="test  1234 foo"
SPLIT_VAR=${TEST/ */ }

Он заменит первое совпадение с шаблоном " *" (на один пробел, а затем что угодно )и заменит его на " " (на один пробел ). Таким образом, вы сохраняете первое слово и первый пробел.

См.http://www.tldp.org/LDP/abs/html/string-manipulation.htmlдля получения дополнительной информации об использовании манипуляций со строками.

И в качестве примечания, это также работает менее развитая оболочка (, протестированная на реализации ash в busybox ).

1
27.01.2020, 20:14

Теги

Похожие вопросы