我是sed正则表达式的新手。有人可以帮我理解这个表达是什么意思吗?
sed -n 's/^.*-\([0-9]*\)-.*/\1/p'
我还想做的是基本上将单个数字替换成双位数字,例如1和01,因此需要修改上面的表达式以适应它。
我已经看到格式为\10\2\3/
的表达式,以便执行上述操作。这是如何工作的?
提前感谢您的帮助!
答案 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