如何grep仅存在于行的特定数量的空格内的字符串

时间:2016-09-19 21:17:48

标签: sed grep

如何在一行的前36个空格中搜索字符串?

我无法在一行中搜索一串数字(例如" 47225"或" 82115")。我知道这个数字实际上可能在一行内发生两次,但我知道如果它在前36个空格中包含这个数字,我只想要行中的信息。不幸的是,它没有按列分隔,因为在此特定列中可能还有其他数字在数字字符串之前或之前。

我试过grepping" 47225"和" 47225"但是这并没有帮助在前36个空格之后可能存在相同的字符串这一事实。我可以使用sed或aux吗?如果是这样,怎么样?

3 个答案:

答案 0 :(得分:1)

试试这个:

cut -c-36 file | grep -E '47225|82115'

我想通过空格,你的意思是字符位置 ......

答案 1 :(得分:1)

使用:

^.{0,31}

(47225|82115)匹配零到31个字符。 $ cat file keep...........................47225 keep...........................82115 ignore..........................47225 ignore..........................82115 匹配您想要的五位数字中的任何一个。因为5 + 31 = 36,这确保只有47225或82115出现在该行的前36个字符内时才匹配。

实施例

考虑这个测试文件:

$ grep -E '^.{0,31}(47225|82115)' file
keep...........................47225
keep...........................82115

上面的前两行是36个字符,应该匹配。上面的最后两行是37个字符长,因此应该被忽略。

我们的命令返回:

#include <stdio.h>

void some_fn(char *x)
{
    printf("%d\n", x);
}

int main()
{
    // They are stored on the same memory address
    some_fn("A");
    some_fn("A");

    some_fn("B");
}

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed -r 'h;s/^(.{36}).*/\1/;/pattern1|pattern2/!d;x' file

复制该行,删除字符36后的所有内容,模式匹配,如果未找到则删除,否则恢复原始行。