2012-06-26 2 views
2

характера В настоящее время я использую следующий Oneliner для удаления специальных символов:Предотвратить столбец сдвиг после удаления

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

Однако иногда случается так, что столбец содержит только специальный символ *. Как предотвратить перемещение столбца, если он содержит только *? Можно ли использовать заполнитель, так что всякий раз, когда возникает, что единственный символ (символы) в столбцах два и/или четыре: *, он заменяется на 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 

ответ

1

Попробовать в AWK,

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

Я надеюсь, что это поможет.

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 * 
0

Это может работать для вас (GNU СЭД):

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 
Смежные вопросы