【问题标题】:empty line in sed regexp fails to find stuffsed 正则表达式中的空行找不到东西
【发布时间】:2014-09-07 04:04:20
【问题描述】:

我在一个文本文件中有这个块。在 vi 中(根据 View line-endings in a text file 使用 :set list 打开行尾字符的可视化)它读取

 SHARE_INFO_FOR: SHARE/u_MYGROUP/$
 USER/GROUP   SHARES  PRIORITY  STARTED  RESERVED  CPU_TIME  RUN_TIME   ADJUST$
 u_zc        10000    3333.333     0        0         0.0        0       0.000$
 $
 SHARE_INFO_FOR: SHARE/u_MYSECONDGROUP/$

如果我尝试用 sed 隔离它,我会使用多行正则表达式

 sed -rn '/SHARE\/u_MYGROUP\//{:a;N;/^$/{/.*/p;d};ba}'

sed 不标识块的结束行。 而如果我明确输入 if next 非空行的内容,它就可以工作。

 sed -rn '/SHARE\/u_MYGROUP\//{:a;N;/SHARE\/u_MYSECONDGROUP\//{/.*/p;d};ba}'

我的问题当然是一般我不知道下一行中的组名是什么,所以我想使用名称作为开始标记和空行作为块结束标记来分隔有趣的块。

你知道为什么^$ 不能作为 sed 中正则表达式的分隔符吗?

【问题讨论】:

  • 该文件是否为 CRLF 结尾的 DOS 格式文件?在vim 中尝试:set,看看是fileformat=dos 还是fileformat=unix

标签: regex sed


【解决方案1】:
sed -n '\#SHARE/u_MYGROUP/#,/^$/{
 p
 }' YourFile

如果它只需要打印从具有SHARE/u_MYGROUP/ 的行开始直到下一个第一个空行的块。它使用第一个转义字符来更改模式的默认分隔符(/)(#

【讨论】:

  • 这其实好多了!多谢!我通过使用 sed -n '\#SHARE/u_MYGROUP/#,/^$/{p;}' lastlog 将其作为一个内联命令放入脚本中。太糟糕了,我没有足够的声誉来投票赞成这个答案。
  • 您可以将{ p } 替换为p,避免多行。即使您需要在 { } 中分组的多个操作,您通常也可以将它们放在一行中,中间使用分号(在 Mac OS X 上,您需要在最后一个命令之后和 } 之前使用分号)。
【解决方案2】:

在 1970 年代中期,当 awk 被发明时,所有用于执行多行操作的 sed 语言结构在字面上都已过时:

$ awk -v RS= '/SHARE\/u_MYGROUP/' file
SHARE_INFO_FOR: SHARE/u_MYGROUP/
USER/GROUP   SHARES  PRIORITY  STARTED  RESERVED  CPU_TIME  RUN_TIME   ADJUST
u_zc        10000    3333.333     0        0         0.0        0       0.000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 2016-03-04
    • 1970-01-01
    • 2016-10-19
    • 2013-08-17
    相关资源
    最近更新 更多