【问题标题】:sed: Delete first line of hold space?sed:删除保留空间的第一行?
【发布时间】:2015-11-21 20:28:49
【问题描述】:

如何删除sed中第一行的hold space?

我试过了

x;
s/.*\n//;
x;

.*\n 匹配到最后一个换行符,删除除最后一行之外的所有行。

【问题讨论】:

  • 如果你想稍后删除它,你能告诉你为什么要保留它吗?它可能有助于找到最佳解决方案。
  • 任何时候你使用“保持空间”这个术语,你都在使用错误的工具,因为 sed 仅用于在单个行上进行简单替换,并且它的所有构造除了 s、g 和 p(使用 -n ) 在 1970 年代中期 awk 被发明时变得过时。如果您需要帮助,请发布一些示例输入和预期输出并添加 awk 标签。

标签: sed


【解决方案1】:

这应该从“保留空间”中删除第一行

x;s/[^\n]*\n//

例子:

kent$  sed -n 'H;${x;p}' <(seq 3)      

1
2
3

删除第一个空行:

kent$  sed -n 'H;${x;s/[^\n]*\n//;p}' <(seq 3) 
1
2
3

【讨论】:

  • $ sed -n 'H;${x;s/[^\n]*\n//;p;}' &lt;(seq 3) 给了3。我认为它将[^\n] 解释为“不匹配\n”。有什么办法可以规避?
  • @EpicOrange Sed 应将 \n 解释为单个换行符。但是你想摆脱一条线来完成什么?也许您需要将文件读入保持(如果它适合的话)然后只需搜索替换您想要摆脱的行并将其换回。
  • 在上面的示例中,由于只使用了H 命令,因此可以安全地删除第一个字符(s/.//)以获得相同的结果。要删除保持空间/模式空间中的第一行,那么问题是删除零个或多个非换行符,然后是一个换行符(s/^[^\n]*\n//)。
  • @A.Danischewski 不,某些 sed 会将 \n 解释为换行符。 POSIX 未定义该行为。所有 POSIX sed 都会将反斜杠后跟文字换行符识别为换行符。无论如何,这根本不是 sed 的工作,所以它是学术性的。
  • @EdMorton 我不确定“POSIX 未定义”。 It says The escape sequence '\n' shall match a &lt;newline&gt; embedded in the pattern space. A literal &lt;newline&gt; shall not be used in the BRE of a context address or in the substitute function. The revision from 2008 也是这么说的。
【解决方案2】:

简单地将任何随机字符串与h1h;1d,默认为空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-22
    • 2013-09-23
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    相关资源
    最近更新 更多