поиск подстроки - PullRequest
       9

поиск подстроки

0 голосов
/ 24 апреля 2018

Я пытаюсь найти подстроку, используя 'sed'.

Например, извлеките строковое слово перед символом '(' и напечатайте его.

Выражение ниже работает только в том случае, если между словом и символом «(» нет пробела.

$ echo "void fun()" | sed 's/.* \(.*\)(.*/\1/'
fun
$ echo "void fun ()" | sed 's/.* \(.*\)(.*/\1/'

Итак, каково правильное выражение для поиска строкового слова, за которым следует пробел | не пробел '(' символ.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Sed для редактирования, grep для поиска.

$ echo $'void fun()\nvoid fun ()' | grep -o '\S\S*\s*()'
fun()
fun ()
  • \S означает не пропуски
  • * означает повторение 0 или более раз
  • \s означает пробел
  • -o печатает только соответствующую часть
0 голосов
/ 24 апреля 2018

* жадный, постарается найти максимально возможное совпадение.Поэтому я бы рекомендовал избегать .* и вместо этого использовать что-то, что не будет соответствовать больше, чем необходимо.[^ ]* будет соответствовать только непробельному символу

$ echo "void fun()" | sed 's/^[^ ]* \([^ ]*\) *(.*/\1/'
fun
$ echo "void fun  ()" | sed 's/^[^ ]* \([^ ]*\) *(.*/\1/'
fun


IMO, это проще сделать с помощью awk

$ echo "void fun()" | awk -F'[ (]' '{print $2}'
fun
$ echo "void fun ()" | awk -F'[ (]' '{print $2}'
fun
  • -F'[ (]' пробелили ( в качестве разделителя полей
  • print $2 печать второго поля
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...