использовать пробел в качестве разделителя с комманды



Я хочу использовать пробел в качестве разделителя с .



какой синтаксис я могу использовать для этого?

647   8  

8 ответов:

cut -d ' ' -f 2

где 2-номер поля, разделенного пробелом, которое вы хотите.

обычно, если вы используете пробел в качестве разделителя, вы хотите рассматривать несколько пробелов как один, потому что вы анализируете вывод команды, выравнивающей некоторые столбцы с пробелами. (и поиск google для этого приведет меня сюда)

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

tr -s ' ' | cut -d ' ' -f 2

или

awk '{print }'

вы также можете сказать

cut -d\  -f 2

обратите внимание, что есть два пробела после косой черты.

в дополнение к существующим, полезные ответы; кончик шляпы поддержка QZ для поощрения меня опубликовать отдельный ответ:

два различных механизма вступить в игру здесь:

  • (a) ли cut требуется разделитель (пробел, в данном случае), переданный быть отдельный аргумент и будет ли это приемлемо, чтобы добавить его напрямую до -d.

  • (Б), как shell обычно анализирует аргументы перед их передачей вызываемой команде.

(a) отвечает цитатой из руководство POSIX и за коммунальные услуги (выделено мной)

если синопсис стандартной утилиты показывает опцию с обязательное option-аргумент [...] соответствующее заявление использовать отдельные аргументы для этого параметра и его параметр-аргумент. , соответствующая реализация будет и разрешить приложениям указывать параметр и параметр-аргумент в одной строке аргумента без промежуточных символов.

другими словами: в данном случае, , потому что -d's option-аргумент обязательное,вы можете выбрать следует ли указывать разделитель как:

  • (s) либо: a отдельные аргумент
  • (d) или: как значение напрямую подключен до -d.

как только вы выбрали (s) или (d), это shellразбор строковых литералов - (b) - это имеет значение:

  • С (s) все следующие формы эквивалентны:

    • -d ' '
    • -d " "
    • -d \<space> # <space> used to represent an actual space for technical reasons
  • С (d), все следующие формы эквивалентны:

    • -d' '
    • -d" "
    • "-d "
    • '-d '
    • d\<space>

эквивалентность объясняется shellобработка строковых литералов:

все решения выше приводят к точно такая же строка (в каждой группе) на момент cut видит:

  • (s):cut видит -d, а его собственные аргумент, за которым следует отдельные аргумент, который содержит пробел char-без кавычек или \ префикс!.

  • (d):cut видит -dплюс пробел char-без кавычек или \ префикс! - как часть то же самое

Я обнаружил что вы также можете использовать "-d ":

cut "-d "

тест

$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am

scut, вырезанная утилита (умнее, но медленнее, чем я сделал), которая может использовать любое регулярное выражение perl в качестве маркера взлома. Ломая на пробел по умолчанию, но вы также можете разбить на мульти-чар регулярные выражения, альтернативные регулярные выражения и т. д.

scut -f='6 2 8 7' < input.file  > output.file

таким образом, приведенная выше команда будет разбивать столбцы на пробелы и извлекать (0-based) cols 6 2 8 7 в этом порядке.

вы не можете сделать это легко с долей, если данные например несколько мест. Я нашел полезным нормализовать ввод для облегчения обработки. Один трюк заключается в использовании sed для нормализации, как показано ниже.

echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2  #bar

у меня есть ответ (я признаю несколько запутанный ответ), который включаетsed регулярные выражения и захвата группы:

  • \S* - первое слово
  • \s* - разделитель
  • (\S*) - второе слово - плен
  • .* - остаток строки

как sed выражение, группа захвата должна быть экранирована, т. е. \( и \).

The возвращает копию захватили группу, то есть второе слово.

$ echo "alpha beta gamma delta" | sed 's/\S*\s*\(\S*\).*//'
beta

когда вы смотрите на этот ответ, его несколько запутанной, и вы можете подумать: зачем? Ну, я надеюсь, что некоторые, может пойти "Ага!"и будет использовать этот шаблон для решения некоторых сложных проблем извлечения текста с одним sed выражение.

Comments

    Ничего не найдено.