Как распечатать только первое совпадение из каждой строки?

У меня есть файл, который выглядит так:

asd 123 aaa wrqiqirw 123 123 itiewth 123 asno 123 123 132 123 123 123 boagii 123 asdnojaneoienton 123 

Ожидаемый результат:

 123 123 123 123 

Мне нужно будет искать шаблоны с помощью регулярных выражений. Есть ли способ реализовать такую ​​вещь?

7 Solutions collect form web for “Как распечатать только первое совпадение из каждой строки?”

С pcregrep с рисунком 12*3 :

 pcregrep -o1 '(12*3).*' 

С pcregrep или GNU grep -P :

 grep -Po '^.*?\K12*3' 

( pcregrep работает с байтами больше символов, в то время как GNU grep будет работать с символами, определенными в текущей локали (и вам нужно будет убедиться, что вход содержит допустимый текст в текущей локали)).

Обратите внимание, что GNU grep ничего не печатает, если шаблон соответствует пустой строке.

 sed -e ' /\n/{P;d;} s/12*3/\n&\n/;D ' < inoutfile 

В Perl просто

 perl -lne 'print $& if /\d+/' inputfile 

или от stdin:

 echo foo 123 bar 456 doo 789 | perl -lne 'print $& if /\d+/' 123 

Регулярное выражение \d+ будет соответствовать любой строке последовательных чисел, а $& обозначает соответствующую строку.

POSIXLY:

 LC_ALL=C sed -e 's/.*\(123\).*/\1/' <file 

LC_ALL-C требуется LC_ALL-C для предотвращения сбоя sed или получения неожиданного результата, если файл содержит недопустимые символы в вашей текущей локали.

Он также создает одну запись в строке, но соответствует последнему , а не первому .

Для сопоставления первого с GNU sed и PCRE:

 LC_ALL=C sed -E 's/.*?(123).*/\1/' 

( -E для расширенного RE будет в следующей версии POSIX)

С grep в каждой строке:

 while IFS= read -r line; do printf '%s\n' "$line" | grep -o 123 | head -1; done < filename 

То есть:

  • While loop, чтобы проверять каждую строку отдельно.
  • grep -o чтобы получить только совпадение, а не целую строку со спичками.
  • head -1 чтобы выполнить только первое совпадение, а не следующие.

Просто grep должно быть достаточно, чтобы приводить спички из 123 в каждой строке.
Это не имеет смысла, если совпадение является первым, средним или в конце.
Вы просите 123, вы получаете 123, если он находится в строке (если ваш вопрос не выражен правильно, и вам требуется что-то другое)

 $ grep -wo '123' file # -w: word match -o : return only matched string instead of the whole line (default grep operation) 

Если вам нужно поймать с регулярным выражением первое число каждой строки (любое число – любая длина), то это выполнит задание:

 cat <<EOF >file1 asd 111 777 aaa wrqiqirw 123 333 123 itiewth 123 asno 123 4444 111 123 123 567 boagii what 666 asdnojaneoienton 123 EOF grep -Po '^[0-9]+|^.*?\K[0-9]+' file1 #output 111 333 4444 666 

с awk

 re='12*3' awk '{match($0, ENVIRON["re"])}; RSTART{print(substr($0, RSTART, RLENGTH))}' file 
  • awk: Столбцы не печатаются, когда конкатенация строк передается как командная строка
  • sed string с плохими символами
  • как совместить все между строкой и перед следующим пространством
  • sed для поиска вкладки
  • Многострочное Regexp (grep, sed, awk, perl)
  • Добавить текст перед последним совпадающим поисковым словом в файле
  • Скопируйте до определенного многострочного шаблона
  • Удалите строку, используя определенные значения (-)
  • Удалить столбец, который содержит конкретный текст
  • Способ использования `/ usr / bin / env sed -f` в shebang?
  • Grepping для блока текста с частями, которые могут быть необязательными
  • Удалить последнюю запятую из строки bash для созданной петли строки
  • Linux и Unix - лучшая ОС в мире.