sed:替换所有非字母数字字符,除了">"

时间:2015-12-15 15:52:58

标签: sed

我想替换以">"开头的行中的所有非字母数字字符。但不能替换">"。

例如。

>header 44554%782 & -GB

会变成

>header44554782GB

另外想了解更多,如何指定多个" protected"非alpha / num字符,例如,如果我想保留">"和空格或空格和下划线。

这让我在那里中途(删除所有非字母数字)。

sed '/^>/s/[^a-zA-Z0-9]//g'

有什么想法吗?

更新

我没有提供有关我的数据结构的足够信息。

我需要处理的文本文件示例如下:

>gi-565662%% 2s-0[protein]
MPPACTYUSYUUSUSUSUSUUSU
SKKKYTYSSALLATLLAY
>gi|47234377324|+98923[protein]
ATTYTYTFYATYFTTTFARRRLAVVVATPATYTKKKK
>gi|23432|bysg==+4D77
TYTYATCYACTAYCTYATYCTAC
ACTYATCYATCYATCYATC
TPAPPAPPCAPPAPCPAC

4 个答案:

答案 0 :(得分:3)

您可以使用现有代码,并在替换后重新插入前导>

#!/usr/bin/sed -f
/^>/{
s/[^a-zA-Z0-9]//g
s/^/>/
}

答案 1 :(得分:0)

sed(Stream EDitor)能够执行您指定的操作,但更简单的工具可能更合适。如果你的系统有sed,它也可能有tr。用tr你可以做到:

$ hdr=$(echo '>header 44554%782 & -GB' | tr -dc '>a-zA-Z0-9');
$ echo $hdr
>header44554782GB

-c选项告诉tr匹配'> a-zA-Z0-9'中指定的字符集的补码,而-d选项告诉tr删除匹配的字符。

答案 2 :(得分:0)

这可能更简单

sed -r '/^[>].*/{s/[^[:alnum:]_> ]//g}

例如

echo '>header _44554%782? & -GB'|sed -r '/^[>].*/{s/[^[:alnum:]_> ]//g}'

ouptut

>header _44554782  GB

   > _ and space character protected

答案 3 :(得分:-1)

你喜欢这样:

String result = yourString.replaceAll("[\\W&&[^<]]", "");

已编辑:

var txt  = String(">header 44554%782 & -GB");
var exec = txt.replace(/[^>][\W]/g, "");
alert(exec);//>heade445578-GB