Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 提取两个标记之间的文本并替换字符_Regex_Unix_Sed - Fatal编程技术网

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