Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用于文件命名的SED正则表达式?_Regex_Shell_Sed - Fatal编程技术网

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

Regex 用于文件命名的SED正则表达式?,regex,shell,sed,Regex,Shell,Sed,我不熟悉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 那么您的输出将是

我不熟悉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]*\)-.*
)中查找与表达式匹配的任何内容,并将其替换为第二对斜杠之间的内容(
\1

匹配的正则表达式显示:
^.*-\([0-9]*\)-.*

  • ^
    表示“从字符串开始”
  • *
    表示任何字符(
    )的零个或多个(
    *
  • -
    被解释为文字连字符
  • 匹配的
    \(
    \)
    定义了一个子表达式,该子表达式可在以后使用(例如,在更换零件中)。该子表达式在下面的表达式中使用
  • [0-9]*
    表示0到9之间的任何字符的零个或多个(
    *
    )——也就是说
    [0-9]
    表示0到9之间的任何单个字符,
    *
    表示找到的任意多个字符
  • 下一个
    -
    也是文本
  • 然后你有了
    *
    ,这意味着任何字符的任何数量
替换位
\1
表示“第一个子表达式”或匹配括号之间表达式部分的匹配内容。在这种情况下,它将是数字序列

为了达到你想去的地方,你可以从这个答案中偷取一些东西:

试一试

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及其使用方法的一个非常好的总结:

这非常有用!非常感谢!这似乎也解决了我的问题。sed-n的/^.-([0-9]*)-./\1/p'| sed-E的/^[0-9]{1}$/0&/'