SED正则表达式用于文件命名?

时间:2017-12-02 00:28:37

标签: regex shell sed

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

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

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

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

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您的命令将扫描连字符之间的一系列数字并打印出数字。

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

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': (
    'rest_framework.parsers.JSONParser',
    )
}

然后你的输出将是:

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]*\)-.*)之间的对应关系。

匹配的正则表达式表示:\1

  • ^.*-\([0-9]*\)-.*表示"从字符串"
  • 开始
  • ^表示零个或多个(.*)任何字符(*
  • .被解释为文字连字符
  • 匹配的-\(定义了一个子表达式,可以在以后使用(例如在替换部分中)。以下用于此表达式。
  • \)表示0到9之间任何字符的零或更多([0-9]*) - 即*表示0到9之间的任何单个字符,以及{{ 1}}意味着你找到的那些。
  • 下一个[0-9]再次为字面
  • 然后你有*,表示任意数量的任何角色。

替换位-表示"第一个子表达式"或匹配括号之间表达式部分匹配的内容。在这种情况下,它将是数字序列。

要想到达你想去的地方,你可以从这个答案中偷走一些东西: https://unix.stackexchange.com/questions/9137/zero-fill-numbers-to-2-digits-with-sed

并尝试

.*

只改变单个数字的位置,并在其前面添加\1,因此您有两位数(并忽略已有两位数的行)。请注意,这会删除sed 's/-\([0-9]\)-/-0\1-/' (安静)和0(打印),以便打印所有行。这也依赖于原始语句中的连字符有用。

如果您的数据中没有连字符,您可以尝试:

-n

此处的范围以p开头,但在某个范围内,它并不代表"从一开始就是"它意味着"不包括"所以sed 's/[^0-9]\([0-9]\)[^0-9]/-0\1-/' 表示"除了数字之外的任何字符"

这两个输出都带有上面的示例输入:

^

此页面是对sed以及如何使用它的非常好的总结:http://www.grymoire.com/Unix/Sed.html