8 ответов:
обычно, если вы используете пробел в качестве разделителя, вы хотите рассматривать несколько пробелов как один, потому что вы анализируете вывод команды, выравнивающей некоторые столбцы с пробелами. (и поиск google для этого приведет меня сюда)
В этом случае один
cutкоманды недостаточно, и вам нужно использовать:tr -s ' ' | cut -d ' ' -f 2или
awk '{print }'
в дополнение к существующим, полезные ответы; кончик шляпы поддержка 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