如何使用 sed 或 tr 删除像“[digits]”这样的字符串?

如何使用 sed 或 tr 删除像“[digits]”这样的字符串?

我最近不得不处理大量下载的论文,其中[...]文本中包含许多烦人的“ ”。像这样:

从电纺膜/支架局部递送多种生长因子[例如血小板衍生生长因子和BMP 2]已被证明可以增强体外细胞活性[41]以及体内骨再生[47]。由于篇幅限制,作者建议读者参考最近发表的有关该主题的优秀评论以获取更多详细信息[34-36]。

期望的输出:

从电纺膜/支架局部递送多种生长因子[例如血小板衍生生长因子和BMP 2]已被证明可以增强体外细胞活性以及体内骨再生。由于篇幅限制,作者建议读者参考最近发表的有关该主题的优秀评论以获取更多详细信息。

我该如何使用trsed删除这个“ [digits]”?我努力了

tr -d '[\*]' 

sed 's/[[*]]//g'

但他们都没有工作。

我应该在哪里进行转义以及如何删除它们而不删除括号中的其他字符(例如 [例如血小板衍生生长因子和 BMP 2] )?

答案1

perl

perl -Mopen=locale -pe 's/\h*\[\d+(\p{dash}\d+)?\]//g' < your-file

其中\p{dash}匹配字符破折号标点符号类别(例如 -֊־᐀᠆‐‐–––―⁓⁻₋−⸗⸚⸺⸻⹀〜〰゠︱︲﹘﹣-)。

这会删除h水平空白但不是那些[x]。然而,这意味着在您的样本上,in vivo [47] . Due变为in vivo . Due.您还可以通过删除水平空白来改进它如果[x]最后跟随!;:,.?或行尾为:

perl -Mopen=locale -pe 's/\h*\[\d+(\p{dash}\d+)?\](\h*(?=[!;:,.?]|$))?//g'

使用 时-Mopen=locale,字符将根据区域设置的字符映射进行解码/编码。类别(上面的破折号、数字、空白)是根据 Unicode 数据确定的。每个匹配的字符列表将取决于 perl 的版本(它决定所使用的 Unicode 版本)。例如,此处以及在使用 UTF-8 编码的语言环境中,\d匹配0123456789٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹߀߁߂߃߄߅߆߇߈߉०१२३४५६७८९০১২৩৪৫৬৭৮৯੦੧੨੩੪੫੬੭੮੯૦૧૨૩૪૫૬૭૮૯୦୧୨୩୪୫୬୭୮୯௦௧௨௩௪௫௬௭௮௯౦౧౨౩౪౫౬౭౮౯೦೧೨೩೪೫೬೭೮೯൦൧൨൩൪൫൬൭൮൯෦෧෨෩෪෫෬෭෮෯๐๑๒๓๔๕๖๗๘๙໐໑໒໓໔໕໖໗໘໙༠༡༢༣༤༥༦༧༨༩၀၁၂၃၄၅၆၇၈၉႐႑႒႓႔႕႖႗႘႙០១២៣៤៥៦៧៨៩᠐᠑᠒᠓᠔᠕᠖᠗᠘᠙᥆᥇᥈᥉᥊᥋᥌᥍᥎᥏᧐᧑᧒᧓᧔᧕᧖᧗᧘᧙᪀᪁᪂᪃᪄᪅᪆᪇᪈᪉᪐᪑᪒᪓᪔᪕᪖᪗᪘᪙᭐᭑᭒᭓᭔᭕᭖᭗᭘᭙᮰᮱᮲᮳᮴᮵᮶᮷᮸᮹᱀᱁᱂᱃᱄᱅᱆᱇᱈᱉᱐᱑᱒᱓᱔᱕᱖᱗᱘᱙꘠꘡꘢꘣꘤꘥꘦꘧꘨꘩꣐꣑꣒꣓꣔꣕꣖꣗꣘꣙꤀꤁꤂꤃꤄꤅꤆꤇꤈꤉꧐꧑꧒꧓꧔꧕꧖꧗꧘꧙꧰꧱꧲꧳꧴꧵꧶꧷꧸꧹꩐꩑꩒꩓꩔꩕꩖꩗꩘꩙꯰꯱꯲꯳꯴꯵꯶꯷꯸꯹0123456789

答案2

您需要匹配[一位或多位数字,然后].

  • 和在正则表达式中被视为特殊字符[]因此您必须使用前导反斜杠对其进行转义
  • 数字可以表示为[0-9][[:digit:]]
  • 您需要多个数字,因此用 来+表示一个或多个

所以

sed -E 's/\[[[:digit:]]+\]//g'

要匹配数字范围(例如在您的示例中)[34–36],您需要稍微扩展模式,[digitsdigits 。 (请注意,破折号似乎不是标准的连字符,而是稍长的连字符]破折号,或者甚至可能破折号.)

sed -E 's/\[[[:digit:]]+–[[:digit:]]+\]//g'

要同时匹配这两个数字,您需要将破折号和第二个数字放在括号中,使破折号和第二个数字可选(...)并用?

sed -E 's/\[[[:digit:]]+(–[[:digit:]]+)?\]//g'

我在全文中使用了sed -E扩展正则表达式(ERE),这意味着更多的字符是隐式特殊的,不需要用反斜杠标记。

答案3

尝试这个:

# it also removes the extra spaces
$ sed -e 's/\[[0-9–]*\]//g;s/[[:blank:]]\+/ /g;s/[[:blank:]]\([\.?!:;,]\+\)/\1/g' file

输出:

从电纺膜/支架局部递送多种生长因子(例如血小板衍生生长因子和骨形态发生蛋白)已被证明可以增强体外细胞活性以及体内骨再生。由于篇幅限制,作者建议读者参考最近发表的有关该主题的优秀评论以获取更多详细信息

相关内容