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

Linux 如何使用unix删除每个备用数字,linux,unit-testing,unix,sed,awk,Linux,Unit Testing,Unix,Sed,Awk,我有一个文件,这个文件包含一个像这样的数字 我想删除每个备用数字 输入:3434 期望输出: 4444您可以: sed -i 's/3//g' thefile 先删除-i选项进行测试。您可以: sed -i 's/3//g' thefile 删除-i选项以首先测试。我不清楚是否要删除第一个、第三个、第五个。。。第二个、第四个、第六个。。。性格 如果前者, $ echo 'abcdefghijklmnopqr' | perl -pe 's/.(?:(.)|$)/$1/g' bdfhjlnpr

我有一个文件,这个文件包含一个像这样的数字

我想删除每个备用数字

输入:
3434

期望输出:
4444

您可以:

sed -i 's/3//g' thefile
先删除
-i
选项进行测试。

您可以:

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

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

我不清楚是否要删除第一个、第三个、第五个。。。第二个、第四个、第六个。。。性格

如果前者,

$ 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;
}
#包括
内部主(空)
{
int c1,c2;
对于(;;){
c1=getchar();
c2=getchar();
#ifdef打印偶数字符
如果(c1==EOF | | c2==EOF)中断;
putchar(c2);
#否则
如果(c1==EOF)中断;
putchar(c1);
如果(c2==EOF)中断;
#恩迪夫
}
返回0;
}

我不清楚您是否要删除第一个、第三个、第五个。。。第二个、第四个、第六个。。。性格

如果前者,

$ 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;
}
#包括
内部主(空)
{
int c1,c2;
对于(;;){
c1=getchar();
c2=getchar();
#ifdef打印偶数字符
如果(c1==EOF | | c2==EOF)中断;
putchar(c2);
#否则
如果(c1==EOF)中断;
putchar(c1);
如果(c2==EOF)中断;
#恩迪夫
}
返回0;
}

这可能适合您:

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

这可能适合您:

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

如果您与
awk有亲缘关系


awk'{for(i=1;i如果您对
awk


awk'{for(i=1;iHi fge,这4是一个例子。中间的数字3也会出现。如果我使用sed,它也会取代它。谢谢你的回答。k,你能澄清你想要实现什么吗?编辑你的问题以便有人能提供准确的答案。hi fge,这4是一个例子。中间的数字3也会出现。如果我使用sed,它也会取代它。谢谢你的回答。OK,你能澄清你想要达到的目的吗?编辑你的问题,以便有人能提供准确的答案。我想你的意思是说“每一个备选数字”,而不是后续数字。我想你的意思是说“每一个备选数字”,而不是后续数字。与C版本不同,你可以用perl:perl-e做同样的事情$/=\1、 while(){print if$i++%2}'使用+++$i获取奇数字符。哦,这很可爱。我不知道你可以将
$/
设置为字符串以外的任何字符,所以我想挑剔一下,这只适用于不包含ASCII SOH字符的输入…然后我注意到没有引号。与C版本不同,你可以使用perl:perl-e'$/=\1;而(){如果$i++%2,则打印}“使用+++$i获取奇数字符。哦,这很可爱。我不知道你可以将
$/
设置为字符串以外的任何字符,所以我想挑剔一下,这只适用于不包含ASCII SOH字符的输入……然后我注意到没有引号。第一个不起作用,在“s”命令中有太多字段这是什么@SiegeX在添加第二个答案后,我手工编辑了第一个答案,并将
/
替换为“\`”,答案现已更正。@Zack
第一个答案不起作用,'s'命令中有太多字段这是什么
@SiegeX在添加第二个答案后,我手工编辑了第一个答案,并将
/
替换为“答案”现在更正。@Zack