Regex 使用sed从字符串返回最后一个[0-9]\{6\}

Regex 使用sed从字符串返回最后一个[0-9]\{6\},regex,sed,pattern-matching,Regex,Sed,Pattern Matching,我想在表单中传递一长串文件名 something_0230232_long_5160mK.csv something_0230232_long-025160mK.csv simething_0230342_lingk425460mK.csv 到sed(或类似的linuxshell工具)并始终获得 每行mK之前的最后一个数字数组 如果正好有6位数字,这就行了。如何将其增强为n位数 echo "something_0230232_long_025160mK.csv" | sed -e "s/S.*

我想在表单中传递一长串文件名

something_0230232_long_5160mK.csv
something_0230232_long-025160mK.csv
simething_0230342_lingk425460mK.csv
到sed(或类似的linuxshell工具)并始终获得 每行mK之前的最后一个数字数组

如果正好有6位数字,这就行了。如何将其增强为n位数

echo "something_0230232_long_025160mK.csv" | sed -e "s/S.*\([0-9]\{6\}\)mK\.csv/\1/p" 

使用GNU
grep的解决方案

$ grep -Po '[0-9]+(?=mK)' file

5160
025160
425460
说明:

-o
仅显示行中匹配的部分

-p
使用perl regexp

[0-9]+     # Match a string of digits (at least one)
(?=mK)     # Followed by mK (positive lookahead)

使用
sed
(自您询问后):

sed-E的/*[^0-9]([0-9]+)mK./\1/'文件

-E
使用扩展的regexp(别名为
-r
但更具可移植性)


使用GNU
grep的解决方案

$ grep -Po '[0-9]+(?=mK)' file

5160
025160
425460
说明:

-o
仅显示行中匹配的部分

-p
使用perl regexp

[0-9]+     # Match a string of digits (at least one)
(?=mK)     # Followed by mK (positive lookahead)

使用
sed
(自您询问后):

sed-E的/*[^0-9]([0-9]+)mK./\1/'文件

-E
使用扩展的regexp(别名为
-r
但更具可移植性)


使用
sed
命令,您走上了正确的轨道:

echo "something_0230232_long_025160mK.csv" |
sed -e 's/^.*[^0-9]\([0-9]\{1,\}\)mK\.csv/\1/'
差异:

  • S
    替换为
    ^
    。这在开始时匹配(数据中没有
    S
    ,因此原始数据永远不会匹配)
  • 6
    替换为
    1,
    。这意味着给定上下文的“一个或多个数字”(严格来说,前一个正则表达式的一个或多个重复,但前一个正则表达式是
    [0-9]
  • 插入
    [^0-9]
    以防止
    *
    过于贪婪。当匹配的位数固定时(
    \{6\}
    ),刚性防止了
    *
    过于贪婪。当你有两个灵活的范围,第一个将是最长的可能。如果没有
    [^0-9]
    ,则会为示例字符串打印一个
    0
  • 删除“p”,以便打印一次值。或者,保留
    p
    并添加
    -n
    作为选项

自我提醒:在发布前(或发布后不久)进行测试。

使用
sed
命令,您已经走上了正确的轨道:

echo "something_0230232_long_025160mK.csv" |
sed -e 's/^.*[^0-9]\([0-9]\{1,\}\)mK\.csv/\1/'
差异:

  • S
    替换为
    ^
    。这在开始时匹配(数据中没有
    S
    ,因此原始数据永远不会匹配)
  • 6
    替换为
    1,
    。这意味着给定上下文的“一个或多个数字”(严格来说,前一个正则表达式的一个或多个重复,但前一个正则表达式是
    [0-9]
  • 插入
    [^0-9]
    以防止
    *
    过于贪婪。当匹配的位数固定时(
    \{6\}
    ),刚性防止了
    *
    过于贪婪。当你有两个灵活的范围,第一个将是最长的可能。如果没有
    [^0-9]
    ,则会为示例字符串打印一个
    0
  • 删除“p”,以便打印一次值。或者,保留
    p
    并添加
    -n
    作为选项

自我提醒:在发布之前(或之后不久)进行测试。

很好,谢谢。你的解决方案让我想起了未来是多么美好!这远远超出了我的想象。我想我需要塞德。非常优雅的解决方案!thx。我补充了我将如何使用
sed
实现它,但是是的
grep
解决方案更优雅:)很好,谢谢。你的解决方案让我想起了未来是多么美好!这远远超出了我的想象。我想我需要塞德。非常优雅的解决方案!thx.我补充了我将如何使用
sed
实现它,但是是的
grep
解决方案要优雅得多:)我的示例并不完美。事实并非总是如此。我的例子并不完美。这个uu并不总是在那里。