Как получить первое слово строки?

Просто указатель, услышьте Вас Nix? (На основе Plan 9. Не уверенный, если это готово к прайм-тайму, все же.)

47
24.02.2013, 17:34
7 ответов

Можно передать его по каналу через awk и заставить его повторить первое слово

echo * | head -n1 | awk '{print $1;}'

или Вы сокращаете строку и выбираете первое слово:

echo *  | head -n1 | cut -d " " -f1

или Вы передаете его по каналу через sed и имеете его, удаляют все кроме первого слова

echo * | head -n1 | sed -e 's/\s.*$//'

Добавленный | head -n1 удовлетворить педантов. В случае, если Ваша строка содержит новые строки | head -n1 выберет первую строку сначала, прежде чем важные команды выберут первое слово из строки, переданной ей.

57
27.01.2020, 19:34
  • 1
    Возвратил бы первое слово каждой строки, не первое слово. –  Stéphane Chazelas 24.02.2013, 22:19
  • 2
    я задаюсь вопросом сколько строк echo * генерирует –  Bananguin 25.02.2013, 16:10
  • 3
    Это зависит, сколько файлов имеет символы новой строки на свое имя или в зависимости от среды или как удар был скомпилирован или ли некоторый названный файл -e или -ee... появляется в списке, сколько времени \n появляется в имени файла. Если существует названный файл -n, это даже не могло бы возвратить строку вообще... –  Stéphane Chazelas 25.02.2013, 17:05
  • 4
    Ну, мы все еще говорим удар и 1. обычно удар не будет передавать строку с новыми строками как одна строка с новыми строками 2. это очень твердо и необычно (невозможный?), чтобы иметь новую строку в имени файла 3. \n в имени файла обнаружится как \n 4. 3 содержит для имен файлов, запускающихся с - 5. даже когда названо с-n или-e эхо откроет stdout и закроет его, когда это будет сделано поэтому, конечно, это возвратит строку и по крайней мере одну строку, в этом отношении 6. я отредактировал свой совет, по крайней мере, заботиться о многострочной проблеме –  Bananguin 25.02.2013, 18:34
  • 5
    , Все 5 точек являются ложью. Попробуйте в пустом dir: touch '$a\nb' 'a\nb'; env BASHOPTS=xpg_echo bash -c 'echo * | wc -l' (xpg_echo включен везде, где bash требуется, чтобы быть совместимым Unix). И в другом пустом каталоге: touch ./-n; bash -c 'echo * | wc -l'. Строка является последовательностью символов, завершенных символом новой строки. Если echo не производит символ новой строки, он не производит строки. Поведение текстовых утилит как cut, awk или sed является неуказанным, если вход имеет дополнительные символы после последнего символа новой строки, и поведение варьируется через реализации. –  Stéphane Chazelas 25.02.2013, 19:52

При предположении, что Вы действительно хотите первое имя файла а не первое слово, вот путь, который не повреждается на пробеле:

shopt -s nullglob
files=(*)
printf '%s\n' "${files[0]}"
7
27.01.2020, 19:34
  • 1
    Первое слово было бы легко, также: files=($(echo *)) –  Hauke Laging 24.02.2013, 14:54
  • 2
    Это повредилось бы на "-n", "-e", "-ne", "-Enenene"..., и в зависимости от как bash был скомпилирован или среда, возможно на символах обратной косой черты, все же. –  Stéphane Chazelas 24.02.2013, 22:18
  • 3
    @HaukeLaging, необходимо было бы отключить globbing. Как: text=$(echo *); set -f; files=($text), иначе больше подстановочных знаков могло быть расширено. –  Stéphane Chazelas 24.02.2013, 22:23
  • 4
    и files=$(echo *); echo ${files%% *} –  vdegenne 27.02.2013, 21:41
  • 5
    @memnoch_proxy, который Это повредит на именах файлов, содержащих пробел, использует его с осторожностью. –  Chris Down 22.05.2013, 05:22

Можно использовать позиционные параметры

set -- *
echo "$1"
5
27.01.2020, 19:34
  • 1
    Знайте, что это уничтожит любые другие аргументы Вашему сценарию, если не выполнено во вспомогательном объеме. Это также расширится до * при отсутствии файлов в каталоге. –  Chris Down 24.02.2013, 14:47
  • 2
    shopt -s nullglob обработал бы тот –  glenn jackman 24.02.2013, 23:13

Если предположить, что позиционная оболочка (/bin/sh или /bin/bash может сделать это)

all=$(echo *)
first=${all%% *}

Конструкция ${all%% *} является примером удаления подстроки . Символ % означает удаление самого длинного совпадения * (пробел, за которым следует что угодно) с правого конца переменной all. Подробнее о манипуляции со строками можно прочитать здесь .

Это решение предполагает, что разделитель - это пробел. Если вы делаете это с именами файлов, то любой с пробелами разобьет его.

21
27.01.2020, 19:34

Это работает:

echo * | grep -o "^\w*\b"

Creds to https://unix.stackexchange. com/a/57879/3920

2
27.01.2020, 19:34

Выберите один из следующих вариантов:

$ FILE=($(echo *))
$ FILE=$(echo * | grep -o "^\S*")
$ FILE=$(echo * | grep -o "[^ ]*")
$ FILE=$(find . -type f -print -quit)

Затем вы можете распечатать его через echo $ FILE .

См. Также: grep единственное первое слово из вывода?

3
27.01.2020, 19:34

Получение полного имени первого файла:

shopt -s nullglob
printf '%s\000' * | grep -z -m 1 '^..*$'
printf '%s\000' * | ( IFS="" read -r -d "" var; printf '%s\n' "$var" )
1
27.01.2020, 19:34

Теги

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