Regex 提取两个标记之间的文本并替换字符
我想换衣服Regex 提取两个标记之间的文本并替换字符,regex,unix,sed,Regex,Unix,Sed,我想换衣服 >lcl|ORF183:9482:8118 unnamed protein product 进入 将所有内容保留在|之后和“空白”之前,并将第二个:替换为- 到目前为止,我正在使用以下代码执行此操作: sed -e '/^>/s/ .*//' -e '/^>/s/|/ /' -e '/^>/s/lcl //' -e '/^>/s/\(.*\):/\1-/' 但我希望用更简单的一行代码来实现这一点。这可以: sed -e 's/\(^.*|\)\(.*
>lcl|ORF183:9482:8118 unnamed protein product
进入
将所有内容保留在|
之后和“空白”之前,并将第二个:
替换为-
到目前为止,我正在使用以下代码执行此操作:
sed -e '/^>/s/ .*//' -e '/^>/s/|/ /' -e '/^>/s/lcl //' -e '/^>/s/\(.*\):/\1-/'
但我希望用更简单的一行代码来实现这一点。这可以:
sed -e 's/\(^.*|\)\(.*\):\(.*\):\(.*\)[[:space:]]\(unnamed.*$\)/>\2:\3-\4/'
以下是基于您尝试过的代码的一些改进
$ sed -e '/^>/s/ .*//' -e '/^>/s/lcl|//' -e '/^>/s/:/-/2' ip.txt
>ORF183:9482-8118
可以简化为-e'/^>/s/|/'-e'/^>/s/lcl/'
-e'/^>/s/lcl |/'
- 如果希望匹配
和
之间的任何文本,请使用s/>[^ |]*.//
- 如果希望匹配
允许指定要替换的匹配项的哪个匹配项,sed
表示将第二个s/:/-/2
替换为:
-
如果您的
sed
实现允许分组,您可以将{}
中的所有命令(用;
分隔)分组到特定地址
$ sed '/^>/{s/ .*//; s/lcl|//; s/:/-/2}' ip.txt
>ORF183:9482-8118
请访问awk以获取学习资源和其他好处:
awk-F'[|]'{print'>“$2}
sed-e's/>lcl |或F183:9482:8118未命名蛋白质产品/>或F183:9482:8118/
欢迎访问该网站!您应该知道,正则表达式是用来识别模式的,我们不能假设哪些字符会发生变化,哪些字符会始终保持不变,因此我们不能给出一个优雅的解决方案,您可以在其他示例中使用,而无需您提供额外的信息。我建议你试试regexr.com网站,使用控制组和游戏。
$ sed '/^>/{s/ .*//; s/lcl|//; s/:/-/2}' ip.txt
>ORF183:9482-8118