【问题标题】:sed: remove all characters except for last n characterssed:删除除最后 n 个字符之外的所有字符
【发布时间】:2019-07-05 04:09:52
【问题描述】:

我正在尝试删除文本字符串中的每个字符,除了剩余的 11 个字符。字符串是Sample Text_that-would$normally~be,here--pe_-l4_mBY,而我想要得到的只是-pe_-l4_mBY

这是我尝试过的:

$ cat food
Sample Text_that-would$normally~be,here--pe_-l4_mBY
$ cat food | sed 's/^.*(.{3})$/\1/'
sed: 1: "s/^.*(.{3})$/\1/": \1 not defined in the RE

请注意,文本字符串并没有真正存储在文件中,我只是以cat food 为例。

操作系统是 macOS High Sierra 10.13.6,bash 版本是 3.2.57(1)-release

【问题讨论】:

  • 改进的示例,没有意识到我放了 10 个字符而不是 11 个:-/
  • 如果您需要 BRE POSIX 模式,请使用 cat food | sed 's/^.*\(.\{11\}\)$/\1/'

标签: bash macos unix sed text-processing


【解决方案1】:

您可以将此sed 与捕获组一起使用:

sed -E 's/.*(.{11})$/\1/' file

-pe_-l4_mBY

【讨论】:

    【解决方案2】:

    基本正则表达式(sed 默认使用)要求捕获组中的括号和大括号表达式中的大括号都被转义。 ({ 被视为要匹配的文字字符。

    $ cat food | sed 's/^.*\(.\{3\}\)$/\1/'
    mBY
    

    相比之下,显式请求 sed 使用带有 -E 选项的扩展正则表达式会反转含义,\(\{ 是文字字符。

    $ cat food | sed -E 's/^.*(.{3})$/\1/'
    mBY
    

    【讨论】:

      【解决方案3】:

      也试试这个:

      grep -o -E '.{11}$' food
      

      grepsed 一样,接受任意数量的文件名参数,因此不需要单独的cat。 (另见useless use of cat.)

      【讨论】:

        【解决方案4】:

        您可以使用尾部或参数扩展:

        string='Sample Text_that-would$normally~be,here--pe_-l4_mBY'
        echo "$string" | tail -c 11
        echo "${string#${string%??????????}}"
        
        pe_-l4_mBY
        pe_-l4_mBY
        

        【讨论】:

          【解决方案5】:

          还有rev/cut/rev

          $ echo abcdefghijklmnopqrstuvwxyz | rev | cut -c1-11 | rev 
          
          pqrstuvwxyz
          

          man rev => rev - reverse lines characterwise

          【讨论】:

            猜你喜欢
            • 2014-11-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-23
            • 2016-11-08
            • 1970-01-01
            • 2011-12-07
            相关资源
            最近更新 更多