我有以下文件:
------FGJFG----HULKJ----LKHJ-------
---JKLJLK-----UIOUOPPOIPIPIPOPIP---
GGJKHKLJK----------JKLHKLJLKJLKJLKJ
我想要这个:
??????FGJFG----HULKJ----LKHJ???????
???JKLJLK-----UIOUOPPOIPIPIPOPIP???
GGJKHKLJK----------JKLHKLJLKJLKJLKJ
即,我想替换所有领先和拖尾' -
'使用相同数量的' ?
',而不是' -
'字母之间
我知道如何做领导:
sed -i ':a;s/^\(-*\)-/\1?/;ta' file
但如何修改命令以替换' -
'在行尾?
答案 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