Поиск без учета регистра между двумя строками в файле - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть файл, сконструированный следующим образом:

# comment with keyword One
some code here
and some more code

# another comment with keyword Two
some code

# more comments and keyword Three
lots
of
code

Я пытаюсь извлечь комментарии и соответствующие строки кода, заданные ключевым словом, без учета регистра.Например:

$ cat file.txt | find_by_keyword one three
# comment with keyword One
some code here
and some more code

# more comments and keyword Three
lots
of
code

Ранее я использовал awk '/^#.*('$se').*$/,/^$/', где $se - это регулярное выражение, которое я строю из предоставленных ключевых слов ((one|two)).Тем не менее, я не мог сделать это без учета регистра.Не было хорошей идеей смешивать пользовательский ввод с вариантами наблюдений ...

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 23 апреля 2019

Если у вас есть GNU sed, вы можете использовать регистр без учета регистра:

#!/usr/bin/env bash

pattern=$(IFS='|'; printf '%s' "$*")
sed -En "/^#.*($pattern)/I,/^$/p"

Первая команда создает шаблон как one|three;команда sed использует расширенные регулярные выражения (-E) и по умолчанию подавляет вывод (-n);Затем он печатает диапазон от любой строки комментария, соответствующей шаблону (флаг I для сопоставления без учета регистра), до следующей пустой строки.

1 голос
/ 23 апреля 2019

Если у вас GNU awk, просто установите IGNORECASE:

$ se='ONE|two'
$ awk -v IGNORECASE=1 '/^#.*('$se').*$/,/^$/' file.txt 
# comment with keyword One
some code here
and some more code

# another comment with keyword Two
some code

Кроме того, лучше передать $se в качестве переменной awk:

$ awk -v IGNORECASE=1 -v se="$se" '$0 ~ "^#.*("se")",/^$/' file.txt 
# comment with keyword One
some code here
and some more code

# another comment with keyword Two
some code

(Если вы используете Mac, инструменты GNU могут быть установлены вместе с homebrew.)

...