目前我使用以下oneliner删除特殊字符:
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
答案 0 :(得分:1)
尝试使用awk,
awk '{ if($2 ~ /^[*]+$/) { gsub ( /[*]/,"N",$2); } if($4 ~ /^[*]+$/ ){ gsub ( /[*]/,"N",$4); } print }' your_file.txt | sed 's/[-$*=+()]//g'
我希望这会对你有所帮助。
答案 1 :(得分: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 *
答案 2 :(得分: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