我用以下方式构造了一个文件:
# 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)
)构建的正则表达式。但是,我无法区分大小写。用案例的变体来替换用户输入似乎不是一个好主意...
有什么想法吗?
答案 0 :(得分:3)
如果您具有GNU sed,则可以使用不区分大小写的模式匹配:
#!/usr/bin/env bash
pattern=$(IFS='|'; printf '%s' "$*")
sed -En "/^#.*($pattern)/I,/^$/p"
第一个命令建立类似one|three
的模式; sed命令使用扩展的正则表达式(-E
)并默认禁止输出(-n
);然后,它将打印范围从匹配模式的任何注释行(不区分大小写的I
标志到下一个空白行)。
答案 1 :(得分:1)
如果您有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工具。)