我需要一些帮助来设置正确的 grep 模式。我需要找到所有出现的pattern
where 行可能有 前导空格。例如:在以下文件中:
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
\s
blank
如果你愿意的话,你可以用空间来改变它。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