Неуверенность в выводе grep из-за подстановочных знаков bash

Я пытаюсь лучше понять команды bash.

ls /usr/include/ | grep \.h

Предполагается перечислить все файлы, заканчивающиеся на.h (библиотеки C), но выводит больше, чем ожидалось.

th read_db .h

ты че ар

нета ш

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

1 ответ

Решение

В grep, ваш шаблон совпадает .h (любой символ, сопровождаемый h) в любом месте строки, а не только в конце.

У вас в основном две проблемы:

  1. Цитирование / экранирование

  2. Проблема с регулярным выражением

Пояснения:

  1. Вы сбежали . с помощью \. и не использовал какие-либо кавычки или другое \таким образом, убегающий избежал бы раковины, и grep получит шаблон Regex как .h, в выражении Regex, которое означает любой символ, сопровождаемый h, Ваша цель сделать grep относиться к . буквально, так что вам нужно процитировать или добавить еще \ лайк:

    '\.h'
    \\.h
    
  2. Теперь вторая проблема, в регулярном выражении, конец строки выражается квантификатором $, так как вам нужно соответствовать .h в конце строки:

    '\.h$'
    

Итак, вместе правильное использование будет:

ls /usr/include/ | grep '\.h$'

Теперь самое главное, не разбирайся ls,

То, что вы делаете, может быть легко и эффективно выполнено с помощью обычной оболочки:

ls /usr/include/*.h
Другие вопросы по тегам