2

目前我正在使用以下 oneliner 来删除特殊字符:

  sed 's/[-$*=+()]//g'

但是有时会出现一列仅包含特殊字符的情况*。如果仅包含 ,如何防止列移动*?是否可以使用占位符,以便每当出现第二列和/或第四列中的唯一字符时,*它都会被替换为Nfor every *

从:

6    cc-g*$    10 cc+c
6    c$c$*g$q    10 ***
6    *c*c$$qq    10 ccc
6    **    10 c$cc
6    **    10 *

可能:

6    ccg    10 ccc
6    ccgq    10 NNN
6    ccqq    10 ccc
6    NN    10 ccc
6    NN    10 N
4

3 回答 3

1

在 awk 中尝试,

awk '{ if($2 ~ /^[*]+$/) { gsub ( /[*]/,"N",$2); } if($4 ~ /^[*]+$/ ){ gsub ( /[*]/,"N",$4); } print  }' your_file.txt  | sed 's/[-$*=+()]//g'

我希望这能帮到您。

于 2012-06-26T10:26:03.050 回答
0

一种使用方式perl。遍历每一行的所有字段并替换特殊字符,除非该字段只有*字符。之后打印它们以一个空格分隔。

perl -ane '
    for my $pos ( 0 .. $#F ) {
        $F[ $pos ] =~ s/[-\$*=+()]//g unless $F[ $pos ] =~ m/\A\*+\Z/;
    }
    printf qq|%s\n|, join qq| |, @F;
' infile

假设infile有问题的内容,输出将是:

6 ccg 10 ccc
6 ccgq 10 ***
6 ccqq 10 ccc
6 ** 10 ccc
6 ** 10 *
于 2012-06-27T08:44:00.487 回答
0

这可能对您有用(GNU sed):

sed 'h;s/\S*\s*\(\S*\).*/\1/;:a;/^\**$/y/*/N/;s/[*$+=-]//g;H;g;/\n.*\n/bb;s/\(\S*\s*\)\{3\}\(\S*\).*/\2/;ba;:b;s/^\(\S*\s*\)\(\S*\)\([^\n]*\)\n\(\S*\)/\1\4\3/;s/\(\S*\)\n\(.*\)/\2/' file
于 2012-06-27T11:14:45.977 回答