Regex 用于文件命名的SED正则表达式?
我不熟悉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 -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&/'