如何在Solaris上使用sed删除下一行

5

我尝试使用sed在文件中查找匹配的模式,然后仅删除下一行。

例如:

地点
纽约 <---- 删除
美国

地点
伦敦 <---- 删除
英国

我尝试过在Linux上运行sed '/Location/{n; d}',但在Solaris上没有成功。

谢谢。


在 Solaris 中的结果是什么? - brandizzi
3个回答

7
正如我在回答你其他sed问题时提到的那样,Solaris的sed是老派的,并且需要更多的手把手指导(或者换句话说),对其语法更加挑剔。你只需要在“d”字符后面添加一个额外的“;”字符即可。
sed '/Location/{n; d;}'

更一般地说,任何可以在{...}内换行的内容,在被卷入单行时都需要一个分号分隔符。但是,与Linux不同,您不能将'a'、'i'、'c'命令卷入单行。
在Solaris标准sed中,'a'、'i'、'c'命令需要在其后面加上'\',且后面没有空格或制表符,然后是尽可能多的数据(可能在某个K限制内)以\n为终止行(没有\r),最后是一个空行。
较新的Solaris安装可能还安装了/usr/xpg4/bin/sed。请尝试。
/usr/xpg4/bin/sed '/Location/{n; d}' 

如果你很幸运的话,它会支持你的快捷语法。我已经没有访问任何solaris机器来测试这个了。
最后,如果那样不起作用,可以安装GNU工具包,其中包含一个更像Linux中你所熟悉的sed。询问你的系统管理员是否已经有了GNU工具,或者是否可以安装。我不确定GNU sed从哪个版本开始支持“放松”的语法,因此不要假设它会在没有测试的情况下修复:-)
希望这能帮到你。

P.S. 欢迎来到StackOverflow,让我提醒您我们通常在这里做三件事情:1)在您得到帮助的同时,尽量回答一些您专业领域的问题;2)阅读FAQs,http://tinyurl.com/2vycnvr;3)当您看到好的问答时,请通过使用灰色三角形将其投票为赞成,http://i.imgur.com/kygEP.png,因为系统的可信度是基于用户分享知识所获得的声誉。还要记得接受最好解决您问题的答案,如果有的话,请按下勾号标志,http://i.imgur.com/uqJeW.png


0

您可以将下一行附加到当前行,然后删除除位置之外的所有内容:

$ cat text 
Location
New York <---- delete
USA

Location
London <---- delete
UK
$ sed '/Location/{N;s/Location.*$/Location/;}' text
Location
USA

Location
UK

我这里没有Solaris,所以想知道这个是否可行。


0

这个 AWK 解决方案对你有用吗?

[jaypal~/temp]$ cat a.txt 
Location
New York <---- delete 
USA

Location
London <---- delete
UK

更新以保留空行 -

!NF 用于保留空白行。这意味着,如果字段数=0,则只需打印该行。 NF是一个内置变量,用于跟踪记录中的字段数。如果我们遇到空行,则跳过其余处理并转到下一行。

!/Location/ 将打印这些行。这是为了保留不跟随位置的行。每当模式为真时,在AWK中打印是一种隐式操作。

第三个模式/操作是当它与RegEx /Location/匹配时打印该行。除了打印该行外,我们还要获取两次getline,这将有效地删除您的下一行,然后打印它。

[jaypal~/temp]$ awk '!NF{print;next}; !/Location/; /Location/{print;getline;getline;print}' INPUT_FILE
Location
USA

Location
UK

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