pau*_*ler 2 sed regular-expression
我最近问工作中的某人如何获取 ipcs -qa 的输出并使其以空格分隔,以便我可以解析它/将其存储在数据库中以进行监控。他给了我这个:
ipcs -qa | sed 's/ [ ]* / /g'
Run Code Online (Sandbox Code Playgroud)
它有效,但为什么呢?他是如何构造那个模式字符串的?我在哪里可以找到有关如何构建它们的文档?我检查了手册页,但它非常不透明。
sed 's/ [ ]* / /g'
\_/ | \____/ | |
| | | | \- g=globally (not just one occurence)
| | | |
| | | \- to
| | |
| | \- from
| |
| \- s=substitute
|
\- program sed
Run Code Online (Sandbox Code Playgroud)
来自部分:
/ [ ]* /
| \_/|
| | \- repeated 0-infinite times
| |
| \- group of characters
|
\- boundary
Run Code Online (Sandbox Code Playgroud)
包括*在内,有3个量词:
它们通常只引用最后一个字符,所以 x* 匹配 x、xxxx 而什么都不匹配。X?匹配 0 或 1 x,+ 匹配 x、xx、xxx 等。但它可以匹配一组字符,如 [aeiou]+ 或组合,封装在括号中:(foo)*。第一个匹配 iiaiaei,第二个 foo 和 foofoo。
组可以是枚举 [aeiou] 或从组:[az] 或组合:[0-9a-fA-F:]。如果您想在组中包含减号,则必须将其放在末尾或开头:[-,:]。
最常用的命令可能是 's' 代替。其他的 'd' 表示删除,'p' 表示打印。
模式被封装在分隔符之间,通常是斜杠。
sed 's/foo/bar/'
Run Code Online (Sandbox Code Playgroud)
Sed 面向行工作。如果你想用 bar 替换一个(第一个)foo,上面的命令是可以的。要替换所有内容,您需要全局使用 'g'。
sed 's/foo/bar/g'
Run Code Online (Sandbox Code Playgroud)
使用 sed 调用行号的其他方法:
sed -n '1,5p' file
Run Code Online (Sandbox Code Playgroud)
-n 默认不打印,1,5p 表示:从第 1 行到第 5 行打印。
sed '6,$d' file
Run Code Online (Sandbox Code Playgroud)
这是等价的。它将从第 6 行删除到结尾。
sed '5q' file
Run Code Online (Sandbox Code Playgroud)
还是一样:第 5 行后退出。
通常对于 sed 来说,该命令更容易写入而不是读取。