2

現在、特殊文字の削除に次のワンライナーを使用しています。

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

ただし、列に特殊文字のみが含まれる場合があります*。列に含まれているだけの場合、列がシフトしないようにするにはどうすればよい*ですか?プレースホルダーを使用して、2列目または4列目、あるいはその両方の文字だけがすべての文字*に置き換えられるようにすることは可能でしょうか?N*

から:

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。各行のすべてのフィールドを走査し、フィールドに*文字しかない場合を除き、特殊文字を置き換えます。その後、それらを 1 つのスペースで区切って印刷します。

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 に答える