替换包含分数和下划线的字符串模式,捕获问题

时间:2019-11-20 11:22:53

标签: regex sed

大家好!

我想用sed替换字符串模式使我感到迷mind。 我搜索了有关sed并转义特殊字符的旧主题,但仍然无法完成。我认为我现在想解决这个问题的想法太过深入了,也看到了简单的方法。

我有一个.tsv文档,其中第二列表示采用以下可能性的形式的标签注释:

B-something
B-something-something
B-something_something
B-something-something_something
I-something
I-something-something
I-something_something
I-something-something_something

我需要用B更改所有B- *,并用I- * s-> I更改。

我知道我可以用Python制作它,但是我需要学习sed以便将来进行快速预处理。

我和regex101一起玩,看来可行的模式如下:

\b([BI]-[a-zA-Z_-]+)\b

使用sed,我可以使用以下命令捕获第一部分,即“ B-first_character”: sed /s/\([BI]-[a-zA-Z]\)/replacing_word/g' input > output

当我使用时什么都不会被替换: sed /s/\([BI]-\)\([a-zA-Z_-]+\)/replacing_word/g'

在我的错误中,最后一段代码可能是一个可怕的错误,现在我的思想有点模糊。 很抱歉这个愚蠢的话题,谢谢大家。

1 个答案:

答案 0 :(得分:1)

sed命令已损坏:您不能在此处的/替换命令前使用s,因为您只想在单引号内使用它。

另外,+是BRE POSIX模式中的文字+。使用-E或将+替换为\{1,\}

要恢复捕获的值,请在替换模式中使用\NUMBER

您可以使用

LC_ALL=C sed 's/\([BI]\)-[a-zA-Z_-]\{1,\}/\1/g' file

请参见online demo

LC_ALL=C将使所有字符类的行为与regex101.com相同。

模式详细信息

  • \([BI]\)-第1组:BI
  • --连字符
  • [a-zA-Z_-]\{1,\}-一个或多个ASCII字母,_-字符。