如何使用unix删除每个备用数字

时间:2011-12-26 11:56:20

标签: linux unit-testing unix sed awk

我有一个文件,此文件包含的相似数字343434343434343434343434。

我想删除所有备用数字

输入:343434343434343434343434

期望的输出: 444444444444

5 个答案:

答案 0 :(得分:3)

我不清楚你是想删除第一个,第三个,第五个......字符还是第二个,第四个,第六个......字符。

如果是前者,

$ echo 'abcdefghijklmnopqr' | perl -pe 's/.(?:(.)|$)/$1/g'
bdfhjlnpr

如果是后者,

$ echo 'abcdefghijklmnopqr' | perl -pe 's/(.)(?:.|$)/$1/g'
acegikmoq

[编辑:上一版本答案中的sed命令无法正确处理一行中奇数个字符的输入。]

这对文件的内容无关,除了它将保留行边界。如果你想删除恰好在文件开头的奇数(或甚至)偏移处的换行符,你必须做一些更复杂的事情 - 那时我可能会达到C,因为它更容易忽略行C中的边界可理解与任何shell实用程序相比:

#include <stdio.h>
int main(void)
{
    int c1, c2;
    for (;;) {
        c1 = getchar();
        c2 = getchar();
#ifdef PRINT_THE_EVEN_CHARACTERS
        if (c1 == EOF || c2 == EOF) break;
        putchar(c2);
#else
        if (c1 == EOF) break;
        putchar(c1);
        if (c2 == EOF) break;
#endif
    }
    return 0;
}

答案 1 :(得分:1)

这可能对您有用:

<<<"3434343434343434343434343" sed 's/.4\?/4/g'
444444444444

或更确切地说:

<<<"3434343434343434343434343" sed 's/[[:digit:]][^[:digit:]]*\([[:digit:]]\?\)/\1/g'
444444444444

答案 2 :(得分:0)

你可以:

sed -i 's/3//g' thefile

首先删除-i选项以进行测试。

答案 3 :(得分:0)

如果您对awk

有亲和力

awk '{for(i=1;i<=NF;i+=2)printf $i}END{print ""}' FS=""

答案 4 :(得分:0)

$ echo 3434343434 | 
    dd cbs=2 conv=unblock 2>/dev/null |
    cut -c1|
    tr -d "\n" ; echo 
33333