我正在阅读不同用户的RealName
发件人dscl
。根据用户的不同,输出可能是以下两种之一:
RealName: <name>
或者:
RealName:
<name>
所以无论哪种情况我都必须sed -e 's|^[RealName:[:space:]]*||g' -e '/^$/d'
得到<name>
。我对正则表达式不熟悉,所以我很难合并这两个表达式。有什么建议吗?(只是为了好玩。该命令按原样工作得很好。)
答案1
- 匹配仅包含 RealName: 和空格的行,将下一行附加到模式空间。
- 删除 RealName: 和换行符。
- 剩下的应该是 <name>
由于命令顺序很重要,下一个(.*)
与以 RealName: 开头的行上的任何内容 () 匹配的 select-lines 命令将在匹配的正则表达式之后出现“一些有趣的内容”。
- 匹配以 RealName: 开头的所有其他行,并且执行相同操作,但不换行
- 删除空行。
sed -E -e '
/^RealName:\s*$/{ N; s/RealName:.*\n// };
/^RealName:(.*)/{ s//\1/ };
/^$/d
' ~/tmp/RealName
如果替代命令在匹配字段中没有任何内容,则默认为前一个 select-lines 命令的正则表达式。
/hello world/{ s//bye mars/ }
<=>
/hello world/{ s/hello world/bye mars/ }
答案2
它不是短很多,但你可以这样做
sed -e 's|^[RealName:[:space:]]*||g;/^$/d'
分号使其成为一个单独的表达式,但您确实想要捕捉一个多行模式,这可能不如您在这里看到的那么好,但是这是一个很好的资源。