Команда grep
выведет строку, если строка содержит строку, соответствующую выражению, что неудобно для поиска указанного содержимого.
Например, у меня есть файлы словаря с форматированием
**word**
1. Definition:
2. Usage
3. Others
Я хотел бы извлечь все слова, чтобы создать список слов в файлах.
grep '\*\*[^*]*\*\*'
Возвращает большую часть контента.
Как использовать, grep
чтобы поймать только word
?
решение1
Как это для слова, используяперлрегулярное выражение ( -P
):
grep -oP '^\s*\*\*\K[^*]+(?=\*\*)' file
Выход :
word
Вот так для слов:
grep -oP '^\s*\d+\.\s*\K\w+' file
Выход :
Definition
Usage
Others
решение2
Существует несколько инструментов, которые можно использовать для извлечения слов. Вот версия, реализованная в sed:
sed '/^\*\*/!d' <your_file
Эта команда сопоставит каждую строку в вашем файле, которая начинается с **
и выведет ее. Остальные строки будут удалены из вывода. Если вы также хотите удалить звездочки, вы можете расширить команду до этого:
sed '/^\*\*/!d;s/\*//g' <your_file
Кроме того, эта команда удалит все *
символы из строки перед ее печатью.
решение3
С awk
помощью:
awk -F'*\\*' 'NF>2{print $2}' infile
пример тестового ввода:
*wrd*
*woooord
**WRD
WORD**
woooooooooood*
**word**
выход:
word
решение4
Если вы не против использования дополнительных инструментов, очень простым решением будет пост-фильтрация вывода grep
с tr
целью удаления всех вхождений символа *
:
grep -x '\*\*[^*]*\*\*' | tr -d '*'
Я также рекомендую вам использовать -x
флаг GNU grep, как указано выше, чтобы сопоставлять только целые строки, чтобы случайно не поймать **word**
окружение другим текстом на той же строке. Это также может ускорить процесс сопоставления с образцом, поскольку теперь он может отбросить многие потенциальные совпадения на ранней стадии.
sed
альтернатива
Вы также можете воспользоваться p
флагом sed для сопоставления, замены и вывода в виде одной команды:
sed -nre 's/^\*\*([^*]*)\*\*$/\1/p'