1

我想以表格形式传递一长串文件名

something_0230232_long_5160mK.csv
something_0230232_long-025160mK.csv
simething_0230342_lingk425460mK.csv

sed(或类似的 linux shell 工具)并始终获取每行 mK 之前的最后一个数字数组

如果正好有 6 位数字,则此方法有效。如何将其增强为 n 位?

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

3 回答 3

4

使用 GNU 的解决方案grep

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

5160
025160
425460

解释:

-o只显示匹配的那部分行。

-P 使用 perl 正则表达式。

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

sed (因为你问)

sed -E 's/.*[^0-9]([0-9]+)mK.*/\1/' file

-E使用扩展的正则表达式(别名-r但更具可移植性)。

s/         # Subsitution -
.*         # Match everything
[^0-9]     # That's not a digit
([0-9]+)   # Capture the last digit string
mK         # Followed by the string mK
.*         # Match everything left
/          # Replace with -
\1         # The captured digit string only
/          #  
于 2012-11-24T21:01:59.903 回答
1

您的sed命令走在正确的轨道上:

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

差异:

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

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

于 2012-11-24T21:27:38.120 回答
0
echo "something_0230232_long_025160mK.csv" | sed 's/^.*_//' | sed 's/mK.csv//'
于 2012-11-24T20:59:40.227 回答