#regex #bash #shell #grep #script
#регулярное выражение #удар #ракушка #grep #скрипт
Вопрос:
Я пытаюсь получить все пути к файлам, которые перечислены в определенном файле, и сохранить их в массиве для дальнейшего использования
Пути к файлам внутри файлов выглядят следующим образом:
include /app/...;
или
#include /app/...; #comment
Но в файле также есть другие пути к файлам, поэтому я хочу найти только те, которые начинаются с include.
Я пытался grep 'include /[^"]*' lt;fileToSearchgt;
, но в нем отсутствуют некоторые файлы, и он их не захватывает
Любая помощь будет оценена по достоинству.
Комментарии:
1. Можете ли вы показать примеры файлов, которых в нем не хватает? Может быть, после этого будет больше одного места
include
?2. Обратите внимание, что без
$
якоря в конце[^"]*
это неэффективно. Он будет соответствовать части строки до первого"
символа.3. Вы правы, что после слова «включить» есть разное количество пробелов, и именно поэтому некоторые из них оставлены. Есть ли способ игнорировать количество пробелов между ними? потому что это варьируется
4. Используйте регулярное выражение, которое соответствует любому количеству пробелов. Вы явно знаете, как количественно оценить закономерности, так как сделали это после
[^"]
.
Ответ №1:
Вы можете попробовать это регулярное выражение:
grep 'includes / [w\-/ .]*' lt;fileToSearchgt;
Пояснение: это регулярное выражение соответствует всем путям после ключевого слова «включить» и начинается с a /
. Ключевое слово и путь могут быть разделены любым количеством пробелов.
Комментарии:
1. Я не думаю
grep
, что поддерживаетs
escape-последовательность.2. похоже, что это зависит от версии grep
3. GNU grep может это сделать, если вы используете
-P
Ответ №2:
grep ищет любую строку, содержащую строку, и возвращает всю строку.
grep "^include."
или grep "^#include."
Если вы хотите получить только путь (без оператора include), вам следует использовать sed, awk…
Комментарии:
1. Какое это имеет отношение к проблеме, в которой отсутствуют некоторые строки?
2. Я думаю, что регулярное выражение (из поста авторов) неверно
3. У некоторых есть комментарии в конце, и я хотел удалить комментарии после пути к файлу, вот где я застрял
4. Регулярное выражение работает, но я думаю, что, как сказал Бармар, после включения есть разное количество пробелов, и я не совсем уверен, как это объяснить.
5. из grep вы получаете целую строку. Затем вы должны использовать awk или sed для обрезки начала (включить) и конца (комментарий)