【问题标题】:modify `sed` to remove exact tag from within a string修改 `sed` 以从字符串中删除确切的标签
【发布时间】:2017-01-20 22:01:28
【问题描述】:

我正在尝试使用grepsed 删除我的数据上的变量标签。 我拥有的数据如下所示:

Please_VB make_VB it_PRP in_IN a_DT range_NN of_IN colored_JJ and_CC precise_JJR Skin_NN tone_NN shades_VBZ

我的目标是只提取标签为_NNS_NNP_NN_JJ_JJR 的单词。对于期望的结果:

range
colored
precise
skin
tone

我现在使用的grepsed 如下:

grep -oh "\w*_\(JJ\|NN\)\w*" test_file.txt | sed 's/[_JJ\|_NN\|_JJR\|_NNP\|_NNS]//g'

然而,该命令行的结果是:

range
colored
precise
kin
tone

它使用grep 正确提取了正确的单词,但sed 正在删除所有对应的字母,而不仅仅是_NX_JX 的确切标签。 有什么方法可以使sed 更精确地只删除指定的确切标签而不是标签内的任何字母?

【问题讨论】:

    标签: regex string sed


    【解决方案1】:

    您可以将 POSIX grep(不支持 -P 选项)与 cut 一起使用:

    grep -Eo '\w*_(NN[PS]?|JJR?)' file | cut -d_ -f1
    
    range
    colored
    precise
    Skin
    tone
    

    cut 用于去掉第一个下划线之后的部分。

    【讨论】:

      【解决方案2】:

      您可以使用 grep 和带有前瞻功能的 PCRE 正则表达式提取这些值:

      grep -oP "\w+(?=_(JJR?|NN[PS]?))"
                   ^^^^^^^^^^^^^^^^^^
      

      online demo

      详情

      • \w+ - 1 个或多个单词字符(字母、数字或下划线)...
      • (?=_(JJR?|NN[PS]?)) - 后面跟着
        • _ - 下划线和...
        • (JJR?|NN[PS]?) - JJJJRNNNNPNNS 子字符串。

      -oP 中的 P 选项将强制使用 PCRE egnine,而o 将只为您提供匹配项。

      【讨论】:

        猜你喜欢
        • 2018-09-08
        • 1970-01-01
        • 2021-06-11
        • 2014-05-27
        • 1970-01-01
        • 2012-04-09
        • 2018-12-25
        • 2013-02-24
        • 2019-06-21
        相关资源
        最近更新 更多