文件中两个字符串之间不区分大小写的搜索

时间:2019-04-23 00:27:33

标签: bash shell awk command-line grep

我用以下方式构造了一个文件:

# 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 个答案:

答案 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工具。)