我尝试使用sed在文件中找到匹配的模式然后删除 只有下一行。
实施例
位置
纽约< ----删除
美国
位置
伦敦< ----删除
英国
我试过sed '/Location/{n; d}'
可以在linux上工作,但不能在solaris上工作。
感谢。
答案 0 :(得分:7)
正如我在关于你的另一个sed问题的答案中提到的,Solaris sed
是老派的,需要更多的手持(或换句话说),对它的语法更加挑剔。
你需要的只是一个额外的';'字符放在“d”字符之后,即
sed '/Location/{n; d;}'
更一般地说,{...}
内的新行可以在汇总到一行时需要使用分号分隔符。但是,您无法像在Linux中那样将'a','i','c'命令汇总到一行。
在Solaris标准sed中,'a',i','c'命令需要一个后面带有NO空格或制表符的尾随'\',尽可能多的数据(可能在某个K限制内){{ 1}}终止行(NO \n
s),后面跟一个空行。
Solaris的较新安装也可能已安装\r
。尝试
/usr/xpg4/bin/sed
如果您很幸运,它将支持您的快捷语法。我再也无法使用任何solaris机器进行测试了。
最后,如果这不起作用,可以安装一些GNU工具包,它们的/usr/xpg4/bin/sed '/Location/{n; d}'
更像是你习惯使用的Linux。询问您的系统管理员是否已经存在GNU工具,或者是否可以安装它们。我不确定哪个版本的gnu sed
开始支持'宽松'语法,所以不要假设它会在没有测试的情况下修复: - )
我希望这会有所帮助。
P.S。 欢迎来到StackOverflow,让我提醒您我们通常在这里做的三件事:1)当您收到帮助时,请尝试给予它,回答您在专业领域的问题2)阅读常见问题解答,http://tinyurl.com/2vycnvr,3)当您看到良好的问答时,请使用灰色三角形http://i.imgur.com/kygEP.png对其进行投票,因为系统的可信度基于用户通过分享知识获得的声誉。还记得通过勾选复选标记http://i.imgur.com/uqJeW.png
来接受更好地解决问题的答案(如果有的话)答案 1 :(得分:0)
您可以将下一行附加到当前行,然后删除不是Location
的所有内容:
$ cat text
Location
New York <---- delete
USA
Location
London <---- delete
UK
$ sed '/Location/{N;s/Location.*$/Location/;}' text
Location
USA
Location
UK
我这里没有Solaris,所以我想知道这是否有效。
答案 2 :(得分:0)
此AWK解决方案是否适合您 -
[jaypal~/temp]$ cat a.txt
Location
New York <---- delete
USA
Location
London <---- delete
UK
已更新以保留空行 -
!NF
用于保留空行。这意味着,如果字段数= 0,那么只需打印该行。 NF是一个内置变量,用于跟踪记录中的字段数。如果我们遇到一个空行,我们跳过剩下的处理并转到下一行。
!/Location/
将打印这些行。这是为了保留未跟随Location的行。只要模式为真,打印就是AWK中的隐式操作。
第三个模式/操作是我们在与RegEx /Location/
匹配时打印该行。除了打印线,我们做两次getline,有效地删除你的下一行,然后打印它。
[jaypal~/temp]$ awk '!NF{print;next}; !/Location/; /Location/{print;getline;getline;print}' INPUT_FILE
Location
USA
Location
UK