У меня есть файл, cities
как это:
[1598] San Diego, US (inactive)
[4517] St Louis, US (inactive)
[6346] Orlando, US (inactive)
Я хочу вырезать названия городов, чтобы у меня было:
San Diego
St Louis
Orlando
Это лучшее, что я мог придумать:
cut -d ',' -f1 cities | cut -d ']' -f2
Но это все еще оставляет мне пробел перед именами. Есть ли cut
подобная команда, которую я могу использовать, которая принимает разделители из нескольких символов, чтобы я мог вырезать ]
?
command-line
cut
Кит Сунде
источник
источник
tr
полезно для удаления ненужных символов.(inactive)
статус или нет? Пожалуйста, предоставьте образец вывода.cut
чтобы вырезать вещи, и вы можете увидеть цель неудачного примера, который я имею, это должно быть достаточно ясно в контексте. Я предоставлю образец, хотя, чтобы прояснить это далее. :)Ответы:
Awk (также проверьте Awk Info ) прекрасно с таким вопросом. Пытаться:
Это определяет разделитель поля
-F
как[],] *
- что означает один вхождение либо закрывающей квадратной скобки, либо запятой, за которой следует ноль или любое количество пробелов. Конечно, вы можете изменить это, чтобы удовлетворить любые требования. Читайте о регулярных выражениях.Как только линия разделена, вы можете делать то, что вы хотите с результатом разделения. Здесь я решил распечатать второе поле только с
print $2
. Обратите внимание, что важно использовать одинарные кавычки вокруг инструкций awk, иначе $ 2 заменяется на оболочку.источник
]
это не угловая скобка. Угловые скобки есть<>
.[]
это «квадратные скобки», или просто «скобки».Вы можете изменить последний
cut
в вашем конвейере так:Вышеуказанное означает, что разделитель полей является пробелом, и мы хотим выбрать все поля, начиная со второго. Полная последовательность становится:
источник
Для более сложного разбора вы должны использовать sed (1) :
Или, используя
-r
для упрощения регулярное выражение, как предлагает pepoluan :источник
Я обычно использую Perl, когда все становится слишком сложно для sed и grep.
Есть несколько способов написать это на Perl. Например, вы могли бы предпочесть, чтобы он был быстрым, или вы могли бы предпочесть, чтобы он обрабатывал небольшие неожиданные проблемы при вводе (например, два пробела, где ожидалось одно).
Один очевидный способ (предполагается, что id является числовым, город - буквенным, статус - буквенным):
Или медленнее, но более разрешительным (делает больше возврата):
Или быстрее (поле останавливается при первом появлении закрывающей скобки):
Из командной строки, а не из скрипта, вы можете использовать
-n
опцию, которая в основном добавляетwhile (<>) { BLOCK }
цикл:или если вы хотите, чтобы использование было похоже на cut, вы можете использовать
-F
опцию, которая похожа на-F
опцию awk , например:Этот способ, очевидно, предполагает, что ни одно поле не будет содержать разделителей.
источник