Мне нужно найти слово пляж, как мне указать, что оно начинается с буквы b и содержит ch? Я пробовал использовать grep '^ s. * Ch', но он выводит строки, содержащие его, и мне просто нужно слово.
$ grep -o '\<b[a-z]*ch[a-z]*' file
При этом будут извлечены все слова, начинающиеся с b
и содержащие ch
. Два [a-z] *
будут соответствовать любому количеству строчных букв. \ <
гарантирует, что b
будет первой буквой в слове.
Параметр -o
для grep
заставит его возвращать только согласованную строку, а не всю строку.
Альтернатива:
$ grep -o '\<b[[:lower:]]*ch[[:lower:]]*' file
Ваш шаблон, ^ s. * Ch
будет соответствовать любой строке , которая начинается с s
и содержит ch
] где-нибудь еще на той же строке.
Ваша проблема заключается в том, что .*
соответствует любой последовательности символов (возможно, без новой строки), включая пробелы.
Итак, вы хотите изменить это на что-то, что соответствует только символам, составляющим слово. Как именно вы это сделаете, зависит от того, какую реализацию регулярных выражений вы используете, и от того, хотите ли вы рассматривать символы из разных алфавитов. Один разумно переносимый способ — использовать [[:alpha:]]*
. Синтаксис, который будет соответствовать началу слова, также зависит от реализации. Для grep вы можете использовать \<
.
Чтобы просто получить слово, есть две опции grep, которые могут помочь: -o
и --color
. Первый просто выводит то, что совпадает, а второй выводит всю строку с выделенным совпадением.
Таким образом, вы, вероятно, захотите
grep -o '\<b[[:alpha:]]*ch' filename