大家好!
我想用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'
在我的错误中,最后一段代码可能是一个可怕的错误,现在我的思想有点模糊。 很抱歉这个愚蠢的话题,谢谢大家。
答案 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组:B
或I
-
-连字符[a-zA-Z_-]\{1,\}
-一个或多个ASCII字母,_
或-
字符。