【问题标题】:regex manipulation and string substitution - alternative to sed正则表达式操作和字符串替换 - sed 的替代品
【发布时间】:2020-02-03 02:43:16
【问题描述】:

我有以下文件

cat file.txt

ID      Location
MNS1    NC_000004.12:g.d.a144120555T>C;NC_001423.23:c.a144120513G<C
MNS2    NC_000142.12:g.a144120552C,N>D
MNS3    NC_000142.12:g.a144120559C>N

我想用这种方式替换输入:

ID      Location
MNS1    NC_000004.12:144120555;NC_001423.23:144120513
MNS2    NC_000142.12:144120552
MNS3    NC_000142.12:144120559

我想删除除:; 之间出现的数字以外的所有内容

例如,我试过:

echo "NC_000004.12:g.d.a144120555T&gt;C;" | sed 's/:[^0-9]*/:/g; s/[^0-9]*;/;/g; s/[^0-9]*$//g'

期望的输出

NC_000004.12:144120555

【问题讨论】:

  • 所有标准 UNIX 工具都将 \w\d 理解为文字字符 wd。一些对 POSIX 标准进行扩展的非标准工具和工具将其中一个或另一个解释为 POSIX 字符类 [[:alnum:]_][[:digit:]] 的简写(例如,GNU awk 接受 \w,但不接受 \d) ,这就是我假设您的意思是他们在您的问题中代表的意思,但是 YMMV.不过,如果这就是您的意思,那么您真的没有充分的理由不在您的问题中简单而清楚地说出“字母”或“数字”。
  • 目前尚不清楚为什么 &gt;C&gt;A 会从您的预期输出中消失,因为它与我认为您所说的 I am trying to remove every \w or \w\. that occurs after : and \d{3} 不匹配

标签: regex string bash


【解决方案1】:

这可能会奏效!

sed -i.bak 's/g\.//g; s/\w>\w//g' filename

对于(NC.*?): concat,关于最终输出的解释会有所帮助,尽管这可能有效:

s/NC[0-9]?:/:/

【讨论】:

  • 明白了!我想太多太多了。我最初打算在 awk 中使用它,但我想这是最好的管道 sedawk
  • 所以我正在尝试删除 g\. 哪个有效。然后\w&gt;\w
  • 许多sed 方言不支持Perl 正则表达式速记\w。您应该很容易找到解释可用解决方法的数十个现有问题,但首先尝试[[:alnum:]]
  • @user171558 将 sed 管道化到 awk(反之亦然)从来都不是最好的方法。
【解决方案2】:

如果 Perl 适合您:

cat file.txt 
ID      Location
MNS1    NC_000004.12:g.d.a144120555T>C;NC_001423.23:c.a144120513G<C
MNS2    NC_000142.12:g.a144120552C,N>D
MNS3    NC_000142.12:g.a144120559C>N

perl -ape 's/:\D+(\d+).*?(?=;|$)/:$1/g' file.txt 
ID      Location
MNS1    NC_000004.12:144120555;NC_001423.23:144120513
MNS2    NC_000142.12:144120552
MNS3    NC_000142.12:144120559

说明:

s/            # substitute
    :           # colon
    \D+         # 1 or more non digits
    (\d+)       # group 1,, 1 or more digit
    .*?         # 0 or more any character but bewline, not greedy
    (?=;|$)     # positive lookahead, make sure we have semi-colon or end of line
/             # with
    :           # colon
    $1          # content of group 1 (i.e. the digits)
/g            # end, global

【讨论】:

  • 谢谢!我猜 perl 是最好的选择
猜你喜欢
  • 2012-12-13
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 2021-11-20
  • 2016-08-16
  • 1970-01-01
相关资源
最近更新 更多