【发布时间】:2017-12-02 09:50:57
【问题描述】:
我是 sed 正则表达式的新手。有人可以帮我理解这个表达是什么意思吗?
sed -n 's/^.*-\([0-9]*\)-.*/\1/p'
我还想做的基本上是将单数数字替换为两位数,例如 1 和 01,因此需要修改上述表达式以适应它。
为了执行上述操作,我看到了具有\10\2\3/ 格式的表达式。这是如何工作的?
提前感谢您的帮助!
【问题讨论】:
我是 sed 正则表达式的新手。有人可以帮我理解这个表达是什么意思吗?
sed -n 's/^.*-\([0-9]*\)-.*/\1/p'
我还想做的基本上是将单数数字替换为两位数,例如 1 和 01,因此需要修改上述表达式以适应它。
为了执行上述操作,我看到了具有\10\2\3/ 格式的表达式。这是如何工作的?
提前感谢您的帮助!
【问题讨论】:
您的命令要做的是扫描连字符之间的数字序列并打印出来。
因此,例如,如果您的输入看起来像这样:
bc-01-ddd
abc-12-ddd
abc-3-ddd
abs-5-ddd
那么你的输出将是:
01
12
3
5
分解你的命令:
sed -n 's/^.*-\([0-9]*\)-.*/\1/p'
-n 表示安静 - 基本上是“只打印我说的话”
这与最后的p 一起使用,这意味着“打印该位”(即打印正则表达式的输出之前)。
引用的正则表达式以 s/ 开头,这是一个替代品,它表示“找到与第一对斜杠(即^.*-\([0-9]*\)-.*)中的表达式匹配的任何内容,并将其替换为第二对斜杠之间的内容(@ 987654330@)。
匹配的正则表达式说:^.*-\([0-9]*\)-.*
^ 表示“从字符串的开头”.* 表示任意字符 (.) 的零个或多个 (*)- 被解释为文字连字符\( 和\) 定义了一个子表达式,可以在以后使用(例如在替换部分中)。这在下面的表达式中使用。[0-9]* 表示 0 到 9 之间的任何字符的零个或多个 (*) -- 也就是说,[0-9] 表示 0 到 9 之间的任何单个字符,* 表示其中的多个如您所见。- 又是文字.*,这意味着任意数量的任意字符。替换位,\1 表示“第一个子表达式”或匹配括号之间的表达式部分的匹配内容。在这种情况下,它将是数字序列。
要到达你想去的地方,你可以从这个答案中窃取一些东西: https://unix.stackexchange.com/questions/9137/zero-fill-numbers-to-2-digits-with-sed
试试看
sed 's/-\([0-9]\)-/-0\1-/'
这只会改变单个数字的位置,并在其前面加上0,所以你有两个数字(并忽略已经有两个数字的行)。请注意,这会删除-n(安静)和p(打印),以便打印所有行。这也依赖于原始语句中的连字符是否有用。
如果您的数据中没有连字符,您可以试试这个:
sed 's/[^0-9]\([0-9]\)[^0-9]/-0\1-/'
这里的范围以^ 开头,但在范围内,它并不表示“从头开始”,而是表示“不包括”,因此[^0-9] 表示“除数字之外的任何字符”
这两个都给出了上述示例输入的输出:
bc-01-ddd
abc-12-ddd
abc-03-ddd
abs-05-ddd
这个页面是 sed 及其使用方法的一个非常好的总结:http://www.grymoire.com/Unix/Sed.html
【讨论】: