sed 模式匹配

sed 模式匹配

我最近向工作中的某人询问如何获取 ipcs -qa 的输出并使其以空格分隔,以便我可以解析它/将其存储在数据库中以进行监控。他给了我这个:

ipcs -qa | sed 's/ [ ]* / /g'

它有效,但为什么呢?他是如何构建该模式字符串的?在哪里可以找到有关如何构建它们的文档?我检查了手册页,但它非常不透明。

答案1

sed 's/ [ ]* / /g'
\_/  | \____/ | |
 |   |    |   | \- g=globally (not just one occurrence)
 |   |    |   |
 |   |    |   \- to
 |   |    |
 |   |    \- from
 |   |
 |   \- s=substitute
 |
 \- program sed

来自部分:

/ [ ]* /
| \_/| 
|  | \- repeated 0-infinite times
|  |
|   \- group of characters
|
\- boundary

包括*在内,共有3个量词:

  • 0 到无穷大? 0或1次
  • 1 到无穷大

它们通常只引用最后一个字符,因此 x* 匹配 x、xxxx,什么也不匹配。 X?匹配 0 或 1 x,x+ 匹配 x、xx、xxx 等。但它可以匹配一组字符,如 [aeiou]+ 或组合,封装在括号中:(foo)*。第一个匹配 iiaiaei,第二个匹配 foo 和 foofoo。

组可以是枚举 [aeiou] 或 from-to 组:[az] 或组合:[0-9a-fA-F:]。如果您想在组中包含减号,则必须将其放在末尾或开头:[-,:]。

最常用的命令可能是“s”来代替。其他的“d”表示删除,“p”表示打印。

模式封装在分隔符(通常是斜杠)之间。

 sed 's/foo/bar/' 

sed 面向行工作。如果你想用 bar 替换一个(第一个) foo ,上面的命令就可以了。要替换全部,您需要“g”来表示全局。

 sed 's/foo/bar/g' 

使用 sed 调用行号的其他方法:

 sed -n '1,5p' file 

-n 默认不打印,1,5p表示:从第1行打印到第5行。

 sed '6,$d' file 

这是等价的。它将删除从第 6 行到末尾的内容。

 sed '5q' file

又是一样的:在第 5 行之后退出。

对于 sed 来说,典型的情况是命令更容易编写而不是读取。

答案2

首先,这些似乎都工作得很好:

sed 's/[ ]*  / /g'
sed 's/  [ ]*/ /g'
sed 's/ *  / /g'
sed 's/  * / /g'
sed 's/   */ /g'
sed 's/  \+/ /g'
sed 's/ \+ / /g'

基本上它所做的就是匹配 2 个空格,加上任意数量的连续空格。这是有效的,因为正则表达式默认是贪婪的,所以“任何数字”都是它能找到的尽可能多的数字。 (并且[ ]是“匹配其中任何一个”,仅列出一个空格字符)

问题中使用的特定语法是理想的,因为您正在处理空格:

sed 's/ [ ]* / /g'

没有两个空格字符是相邻的,所以一眼就能看出有3个空格,少了很可能被解释为拼写错误。

答案3

最好的sed指令曾经。

sed 's/ [ ]* / /g'

会将所有两个或更多的空格序列替换为一个空格,因此所有单词都将以空格分隔。

相关内容