Linux 用sed提取数字

Linux 用sed提取数字,linux,bash,sed,zsh,Linux,Bash,Sed,Zsh,输入 塞德 期望输出 $ fd . ./ -t f | sed -E 's/.*\([0-9]\{1,6\}\).*/\1/' sed: -e expression #1, char 26: invalid reference \1 on `s' command's RHS 还有别的办法吗?我一整天都在努力让它工作…你可以用这个sed: sed-E的/^[^0-9]*([0-9]{1,6})。*/\1/'文件 201909 202012 202012 201903 201903 2019

输入

塞德

期望输出

$ fd . ./ -t f | sed  -E 's/.*\([0-9]\{1,6\}\).*/\1/'  
sed: -e expression #1, char 26: invalid reference \1 on `s' command's RHS

还有别的办法吗?我一整天都在努力让它工作…

你可以用这个
sed

sed-E的/^[^0-9]*([0-9]{1,6})。*/\1/'文件
201909
202012
202012
201903
201903
201903
201903
202003
正则表达式解释:

  • -E
    :启用扩展程序正则表达式模式(ERE)
  • ^
    :开始
  • [^0-9]*
    :匹配0个或更多非数字
  • ([0-9]{1,6})
    :在第一个捕获组中匹配1到6个数字
  • *
    :匹配0个或更多字符

您的命令有几个问题:

  • -E
    使
    sed
    将正则表达式视为POSIX ERE,但它遵循的语法是POSIX BRE的语法
  • 将任何文本与贪婪地抓取所有文本的
    *
    匹配,下一个数字匹配模式始终只匹配一个数字,因为它可以匹配一个数字
  • 您希望输出中正好有6位数字,但允许1到6位
  • 您可以使用以下POSIX BRE解决方案:

    sed-n的/[^0-9]*\([0-9]\{6\}\)./\1/p'
    
    看到哪里了吗

    • -n
      抑制默认行输出
    • [^0-9]*\([0-9]\{6\}*)。
      匹配零个或多个字符(数字除外),然后将6个数字精确捕获到组1中,然后匹配字符串的其余部分,然后
    • \1
      -将整个匹配项替换为组1值
    • p
      -打印替换结果
    $ fd . ./ -t f | sed  -E 's/.*\([0-9]\{1,6\}\).*/\1/'  
    sed: -e expression #1, char 26: invalid reference \1 on `s' command's RHS
    
    ...
    ...
    201909
    202012
    202012
    201903
    201903
    201903
    201903
    202003
    ...
    ...