带有前导空格的 grep 模式

带有前导空格的 grep 模式

我需要一些帮助来设置正确的 grep 模式。我需要找到所有出现的patternwhere 行可能有 前导空格。例如:在以下文件中:

 1. No pattern recognized.
 2. Pattern to be recognized
 3.          Pattern to be recognized here also
 4.  pattern with only one leading space 

我只想 grep 第 2、3 和 4 行。行号仅供参考。

到目前为止我已经尝试了以下方法:

grep -i '^ [[:blank:]]pattern',但它仅返回第 4 行。

grep -i '[[:blank:]]pattern'返回 1、3 和 4。

grep -i '^[[:blank:]]pattern'返回 1、3 和 4。

—— Mike PS 如果这不是合适的论坛,那么请相应地指导我。

答案1

第 2 行和第 3 行包含大写 P 并且需要零个或多个空格,因此请明确指定:

$ grep '[[:blank:]]*Pattern'  input.txt                                  
 Pattern to be recognized
         Pattern to be recognized here also

就我个人而言,我建议用其他东西来扩展你的模式,比如'[[:blank:]]Pattern.*recognized'

答案2

我得到的信息是,您要么根本不需要前导空格,就像第 2 行那样,要么需要多个空格,因为您排除了第 4 行,该行有一个空格。

所以我建议:

egrep -i '^\s*pattern' file.txt | grep -v '^\spattern'

或者使用单个awk

awk 'tolower($0) ~ /^\s*pattern/ && !/^\spattern/ ' file.txt
  • \sblank如果你愿意的话,你可以用空间来改变它。
  • egrep -i '^\s*pattern' file.txt首先,我们让所有行以带有或不带有任何时间前导空格的形式按模式开始。
  • grep -v '^\spattern':然后我们排除那些包含一个前导空格的。

上述示例适用于没有编号的文件,如果您的文件包含前导数字,请使用以下命令:

egrep -i '\s*pattern' file.txt | grep -v '\spattern'

awk

awk 'tolower($0) ~ /\s*pattern/ && !/\spattern/ ' file.txt

相关内容