将两个单独的 sed 表达式合并为一个?

将两个单独的 sed 表达式合并为一个?

我正在阅读不同用户的RealName发件人dscl。根据用户的不同,输出可能是以下两种之一:

RealName: <name>

或者:

RealName:
 <name>

所以无论哪种情况我都必须sed -e 's|^[RealName:[:space:]]*||g' -e '/^$/d'得到<name>。我对正则表达式不熟悉,所以我很难合并这两个表达式。有什么建议吗?(只是为了好玩。该命令按原样工作得很好。)

答案1

  1. 匹配仅包含 RealName: 和空格的行,将下一行附加到模式空间。
  2. 删除 RealName: 和换行符。
  3. 剩下的应该是 <name>

由于命令顺序很重要,下一个(.*)与以 RealName: 开头的行上的任何内容 () 匹配的 select-lines 命令将在匹配的正则表达式之后出现“一些有趣的内容”。

  1. 匹配以 RealName: 开头的所有其他行,并且执行相同操作,但不换行
  2. 删除空行。

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'

分号使其成为一个单独的表达式,但您确实想要捕捉一个多行模式,这可能不如您在这里看到的那么好,但是是一个很好的资源。

相关内容