Исходя из дубликата вопроса, то я выложу решение, которое работает для «традиционных» реализаций регулярных выражений, которые не поддерживают расширения Perl \s
, \W
и т.д. новоприбывших, которые являются не знакомы даже с тем, что существуют разные диалекты (ака вкусы) регулярных выражений, рекомендуется читать, например, Why are there so many different regular expression dialects?
Если у вас есть поддержка класса POSIX, вы можете использовать [[:alpha:]]
для \w
, [^[:alpha:]]
для \W
, [[:space:]]
для \s
и т.д. Но если мы предположим, что пробельные всегда будет пространство, и вы хотите, чтобы извлечь первые три жетона между вам это действительно не нужно.
[^ ]+[ ]+[^ ]+[ ]+[^ ]+
соответствует трем жетонам, разделенным пробегами пробелов. (Я помещаю пробелы в квадратные скобки, чтобы они выделялись, и их легко расширить, если вы хотите включить другие символы, а не только одно регулярное пространство ASCII в наборе разделителей маркеров. Например, если ваш диалект regex принимает \t
для вкладки или вы можете вставить вкладку регулярной на своем месте, вы можете расширить это
[^ \t]+[ \t]+[^ \t]+[ \t]+[^ \t]+
в большинстве оболочек вы можете ввести вкладку буквальной с Ctrl + обвкладки, т.е. префикс его с код выхода, который часто набирается путем удержания клавиши ctrl и ввода v.)
Чтобы реально использовать это, вы можете захотеть сделать
grep -Eo '[^ ]+[ ]+[^ ]+[ ]+[^ ]+' file
где одиночные кавычки необходимы для защиты регулярных выражений из оболочки (двойные кавычки будут работать здесь, тоже, но слабее, или backslashing каждый символ в регулярном выражении, которое имеет значение для оболочки, как метасимвол) или, возможно,
sed -r 's/([^ ]+[ ]+[^ ]+[ ]+[^ ]+).*/\1/' file
заменить каждую строку только с захваченным выражением (в скобках сделать захват группу, которую вы можете сослаться назад с \1
на заменяемой части в s
в пункте sed
). Опция -r
выбирает немного более функциональный диалект регулярного выражения, чем традиционные голые кости sed
; если у вашего sed
его нет, попробуйте -E
или положите обратную косую черту перед каждой скобкой и знаком плюс.
Из-за того, что работают регулярные выражения, три простых метода легки, потому что механизм регулярного выражения всегда возвращает первое возможное совпадение на линии. Если вы хотите, чтобы три токена, начиная с секунд,, вы должны ввести выражение пропуска. Адаптирование sed
сценария выше, что бы
sed -r 's/[^ ]+[ ]+([^ ]+[ ]+[^ ]+[ ]+[^ ]+).*/\1/'
, где вы увидите, как я ставлю в знаке + без маркеров группы до захвата. (Это невозможно сделать с grep -o
, если у вас нет grep -P
, и в этом случае полная гамма расширений Perl доступна вам в любом случае.)
Если ваш диалект регулярного выражения поддерживает {m, n} повторение, вы можете, конечно, реорганизовать регулярное выражение, чтобы использовать это. Если вам нужно большое количество повторений, это, безусловно, является более читаемым и более удобным для обслуживания. Просто убедитесь, что вы не добавите скобки, где разбивают порядок обратной ссылки (первая скобка создает первую группу \1
, второй \2
и т.д.)
sed -r 's/([^ ]+([ ]+[^ ]+){2}).*/\1/' file
Обратите внимание, как вторая группа в скобках необходимо укажите область повторения {2}
(мы хотим повторить больше, чем просто одиночный символ непосредственно перед левой фигурной скобкой). У попытки OP была ошибка, когда повторение было указано вне последней скобки; то обратная ссылка \1
(или что бы там ни называлось на вашем диалекте - TextMate, похоже, использует $1
, как и Perl) будет ссылаться на последнее единственное совпадение скобок, поскольку повторение не является частью захвата, находясь вне скользящие круглые скобки.
На каком языке вы употребляете? Если вы можете совместить первые 3 слова с вашим удовлетворением, отбрасывание исходной строки и просто замена ее содержимым вашего матча кажется более эффективным. – Wrikken
Это своего рода совместная работа, но, похоже, она работает на http://www.phpliveregex.com/p/3jo. '^ ((\ W + \ S +) {3}) (. *) $'. С этим вы получаете ... все, первые 3, 3, а затем остальные ... Не знаете, как вы могли бы использовать его оттуда. Не знаю, как это работает для Textpad, поскольку я понятия не имею, что это такое. – qooplmao
@Wrikken - плакат с текстовой панелью. Textpad утверждает: «Его мощный механизм регулярных выражений совместим с Perl и JavaScript». – bluefeet