используйте пробел как разделитель с командой cut
Я хочу использовать пробел в качестве разделителя с .
какой синтаксис я могу использовать для этого?
8 ответов
обычно, если вы используете пробел в качестве разделителя, вы хотите рассматривать несколько пробелов как один, потому что вы анализируете вывод команды, выравнивающей некоторые столбцы с пробелами. (и поиск google для этого привел меня сюда)
В этом случае один cut
команды недостаточно, и вам нужно использовать:
tr -s ' ' | cut -d ' ' -f 2
или
awk '{print }'
чтобы дополнить существующие, полезные ответы; кончик шляпы к поддержка QZ за поощрение меня опубликовать отдельный ответ:
два различных механизма вступить в игру здесь:
(a) будь
cut
требуется разделитель (пробел, в данном случае), переданный быть отдельный аргумент или приемлемо ли добавить его напрямую до-d
.(b) как shell обычно анализирует аргументы перед передачей их вызываемой команде.
(a) отвечает цитатой из рекомендации POSIX для утилит (выделено мной)
если синопсис стандартной утилиты показывает опцию с обязательное option-аргумент [...] соответствующее заявление использовать отдельные аргументы для этой опции и ее option-argument. , соответствующая реализация будет и разрешить приложениям указывать параметр и параметр-аргумент в одной строке аргумента без промежуточных символов.
другими словами: в данном случае, , потому что -d
параметр-аргумент обязательное, вы можете выбрать указать ли разделитель как:
- (s) либо: a отдельные аргумент
- (d) или: как значение напрямую подключен до
-d
.
как только вы выбрали (ы) или (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's строка-литерал обработки:
все решения выше приводят к точно такая же строка (в каждой группе) на момент 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, cut-like утилита (умнее, но медленнее я сделал), которая может использовать любое регулярное выражение perl в качестве токена разрыва. Ломая на пробел по умолчанию, но вы также можете разбить на мульти-чар регулярные выражения, альтернативные регулярные выражения и т. д.
scut -f='6 2 8 7' < input.file > output.file
таким образом, вышеуказанная команда будет разбивать столбцы на пробелы и извлекать (0-based) cols 6 2 8 7 в этом порядке.
вы не можете сделать это легко с помощью cut, если данные имеют, например, несколько пробелов. Я нашел полезным нормализовать ввод для упрощения обработки. Один из трюков-использовать sed для нормализации, как показано ниже.
echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2 #bar
у меня есть ответ (я признаю, что несколько запутанный ответ), который включаетsed
регулярные выражения и захвата группы:
-
\S*
- первое слово -
\s*
- разделитель -
(\S*)
- второе слово - плен -
.*
- остаток строки
как sed
выражение, группа захвата должна быть экранирована, т. е. \(
и \)
.
на возвращает копию захваченная группа, то есть второе слово.
$ echo "alpha beta gamma delta" | sed 's/\S*\s*\(\S*\).*//'
beta
когда вы смотрите на этот ответ, его несколько запутанной, и вы можете подумать: зачем? Ну, я надеюсь, что некоторые, может пойти "Ага!"и будет использовать этот шаблон для решения некоторых сложных проблем извлечения текста с помощью одного sed
выражение.