【问题标题】:SED regular expression for file naming?用于文件命名的 SED 正则表达式?
【发布时间】:2017-12-02 09:50:57
【问题描述】:

我是 sed 正则表达式的新手。有人可以帮我理解这个表达是什么意思吗?

sed -n 's/^.*-\([0-9]*\)-.*/\1/p'

我还想做的基本上是将单数数字替换为两位数,例如 1 和 01,因此需要修改上述表达式以适应它。

为了执行上述操作,我看到了具有\10\2\3/ 格式的表达式。这是如何工作的?

提前感谢您的帮助!

【问题讨论】:

    标签: regex shell sed


    【解决方案1】:

    您的命令要做的是扫描连字符之间的数字序列并打印出来。

    因此,例如,如果您的输入看起来像这样:

    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

    【讨论】:

    • 这太有用了!非常感谢!
    • 这似乎也解决了我的问题。 sed -n 's/^.*-([0-9]*)-.*/\1/p' | sed -E 's/^[0-9]{1}$/0&/'
    猜你喜欢
    • 2017-10-23
    • 2013-08-07
    • 2011-09-14
    • 2012-10-29
    • 2013-08-06
    • 2012-11-22
    • 2017-08-10
    相关资源
    最近更新 更多