sed:如何删除保留空间的第一行?

4

如何在sed中删除保留空间的第一行?

我尝试过以下命令:

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

但是.*\n匹配到最后一个换行符,删除除最后一行以外的所有内容。


你能说一下为什么你想要删除它,却把它保留在暂存空间中吗?这可能有助于找到最佳解决方案。 - Thomas Baruchel
1
每当你使用“保留空间”这个术语时,你都在使用错误的工具,因为sed仅用于对单个行进行简单的替换,除了s、g和p(带有-n)之外的所有构造都已经过时,自20世纪70年代中期awk被发明以来。发布一些样本输入和预期输出,并添加一个awk标签,如果你需要帮助的话。 - Ed Morton
2个回答

3

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

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;}' <(seq 3) 输出 3。我认为它将 [^\n] 解释为“不匹配 \n”。有什么方法可以规避这个问题吗? - kalanchloe
@EpicOrange Sed应该将\n解释为单个换行符。但是,你想通过去掉一行来实现什么目的?也许你需要将文件读入hold(如果它适合的话),然后简单地搜索替换你想要去掉的行,并将其交换回来。 - user4401178
在上面的例子中,由于仅使用了 H 命令,因此可以安全地删除第一个字符 (s/.//) 以实现相同的结果。要删除保留空间/模式空间中的第一行,则需要按照所述方式删除零个或多个非换行符,然后是换行符 (s/^[^\n]*\n//)。 - potong
@A.Danischewski 不,一些sed命令会将\n解释为换行符。这种行为在POSIX标准中是未定义的。所有符合POSIX标准的sed命令都会将反斜杠后跟一个字面上的换行符识别为换行符。不过,这根本不是sed的工作,所以这只是学术上的问题。 - Ed Morton
@EdMorton 我不确定"POSIX未定义"这一点。它说 转义序列“\ n”应匹配模式空间中嵌入的<newline>。 BRE中不应使用上下文地址或替换函数的文字<newline>。 2008版的修订也是这样说的。 - Kamil Maciorowski
是的,看起来他们现在已经为sed定义了那个。 - Ed Morton

0

简单地放置任何随机字符串与h,例如1h;1d,默认为空。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接