Увімкніть греп, щоб точно збігатися зі звичайним виразом


3

Увімкніть команду 'grep', щоб повернути регулярний вираз точно збігався.

Команда grepнадрукує рядок, коли рядок містить рядок, що відповідає виразу, який не є зручним для пошуку заданого вмісту. Наприклад, у мене є файли лексики з форматуванням

    **word**
    1. Definition:
    2. Usage
    3. Others

Я хотів би отримати всі слова, щоб скласти список слів у файлах

    grep '\*\*[^*]*\*\*'

Він повертає основні маси вмісту.

Як дозволити грепу вловлювати лише «слово»?


1
Будь ласка, оновіть питання, щоб включити бажаний та отриманий результат.
Німеш Неема

Відповіді:


3

Використовуйте awk.

Ця команда дозволить "витягнути" об'ємний список слів, припускаючи, що він у вказаному вище форматі:

awk '/\*\*/,/\*\*/ {print substr($0, 3, length($0)-4)}' <filename>

Приклад:

Для цього прикладу припустимо, що у нас є текстовий файл words.txtіз таким вмістом:

**test**
1. Definition:
2. Usage
3. Others

**foo**
1. Definition:
2. Usage
3. Others

**bar**
1. Definition:
2. Usage
3. Others


$ awk '/\*\*/,/\*\*/ {print substr($0, 3, length($0)-4)}' words.txt

test
foo
bar

Що це робить?

  • /\*\*/,/\*\*/Це діапазон візерунків . Я міг би зробити це, шукаючи перший набір зірочок ( /\*\*), і було зроблено, але я використав повний діапазон для повноти. Один метод не є більш "правильним", ніж інший.

  • {print substr($0, 3, length($0)-4)}'Це друкує підрядність (рядка **word**), починаючи з 3-го символу, довжиною цілого рядка ( length($0)) мінус чотири символи (чотири зірочки).

  • <filename>Це вхідний файл для обробки awkкоманди


0

Ось результат, який я отримав, використовуючи прикладний файл із вмістом, запозиченим у Allan, разом із вашою grepкомандою:

вихід командного рядка

Спочатку я подумав, що проблеми не виникає, тому що, здається, повертаються рядки, що містять слово, і я припускав, що ви хочете зберегти це **, враховуючи, наскільки явно навмисне це здається в рядку regexp.

Але, прочитавши ваші запитання уважніше, я зараз бачу, що ви не хочете **, а хочете лише те слово, яке міститься в **.

Для цього ви все ще можете використовувати ту саму grepкоманду, а потім передайте її до, trщоб видалити **:

grep '\*\*[^*]*\*\*' /path/to/file | tr -d '*'

Результат команди оболонки

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.