Согласно тому, что у меня есть в моем .bashrc
, вам понадобится что-то вроде
bind '"\e[6~": history-search-forward'
Поскольку есть несколько пробелов, которые вы хотите использовать
${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.
Существует простое решение — использовать%%
(${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
Если вы не возражаете против внешнего вызова, используйте 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
Чтобы использовать только 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
Вы также можете использовать простой инструмент cut
, который вырезает строки на основе разделителя:
echo "$mystring" | cut -d' ' -f 1
Где:
-d' '
устанавливает разделитель пробелом -f 1
дает первое поле (на основе разделителя)Вы можете использовать собственные операции со строками оболочки:
TEST="test 1234 foo"
SPLIT_VAR=${TEST/ */ }
Он заменит первое совпадение с шаблоном " *" (на один пробел, а затем что угодно )и заменит его на " " (на один пробел ). Таким образом, вы сохраняете первое слово и первый пробел.
См.http://www.tldp.org/LDP/abs/html/string-manipulation.htmlдля получения дополнительной информации об использовании манипуляций со строками.
И в качестве примечания, это также работает менее развитая оболочка (, протестированная на реализации ash в busybox ).