用'?'替换行尾的所有连字符

时间:2015-03-16 16:35:30

标签: bash perl sed

我有以下文件:

------FGJFG----HULKJ----LKHJ-------
---JKLJLK-----UIOUOPPOIPIPIPOPIP---
GGJKHKLJK----------JKLHKLJLKJLKJLKJ

我想要这个:

??????FGJFG----HULKJ----LKHJ???????
???JKLJLK-----UIOUOPPOIPIPIPOPIP???
GGJKHKLJK----------JKLHKLJLKJLKJLKJ

即,我想替换所有领先和拖尾' -'使用相同数量的' ?',而不是' -'字母之间

我知道如何做领导:

sed -i ':a;s/^\(-*\)-/\1?/;ta' file

但如何修改命令以替换' -'在行尾?

6 个答案:

答案 0 :(得分:2)

您可以使用perl

perl -pe 's/\G-|-(?=-*$)/?/g'

<强>输出:

cat file

??????FGJFG----HULKJ----LKHJ???????
???JKLJLK-----UIOUOPPOIPIPIPOPIP???
GGJKHKLJK----------JKLHKLJLKJLKJLKJ

答案 1 :(得分:0)

这是awk

awk -F"[^-]" '{a=b="";for (i=1;i<=length($1);i++) a="?"a;sub(/^-+/,a);for (i=1;i<=length($NF);i++) b="?"b;sub(/-+$/,b)}1' file
??????FGJFG----HULKJ----LKHJ???????
???JKLJLK-----UIOUOPPOIPIPIPOPIP???
GGJKHKLJK----------JKLHKLJLKJLKJLKJ

答案 2 :(得分:0)

通过Perl。

$ perl -pe 's/(?<=[^-])-+(?=[^-\n])(*SKIP)(*F)|-/?/g' file
??????FGJFG----HULKJ----LKHJ???????

???JKLJLK-----UIOUOPPOIPIPIPOPIP???

GGJKHKLJK----------JKLHKLJLKJLKJLKJ

(?<=[^-])-+(?=[^-\n])匹配中间的所有连字符。 (*SKIP)(*F)使匹配失败,-之后的|将匹配剩余字符串中的所有连字符。

答案 3 :(得分:0)

在Perl中,

perl -pe 's/^(-+)/"?" x length($1)/e; s/(-+)$/"?" x length($1)/e' file

答案 4 :(得分:0)

您使用前导破折号的相同循环机制可以用于尾随破折号,并进行适当的微小更改:

sed -i -e ':a;s/^\(-*\)-/\1?/;ta' \
       -e ':b;s/-\(-*\)$/?\1/;tb' file

请注意,这假定GNU sed有几个理由;你必须使用sed的BSD(Mac OS X)版本做一些不同的事情。

答案 5 :(得分:0)

这个单行Perl程序将按照您的要求执行

perl -pe 's/(?|^(\-+)|(\-+)$)/$1=~tr|-|?|r/eg' myfile.txt