![匹配字符串或数字后如何删除后续行?](https://linux22.com/image/128742/%E5%8C%B9%E9%85%8D%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%88%96%E6%95%B0%E5%AD%97%E5%90%8E%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%E5%90%8E%E7%BB%AD%E8%A1%8C%EF%BC%9F%20.png)
考虑我有一个大文件,其中包含以下信息(部分cat file
):
33.829037 -0.113737 1.157153
33.830036 -0.113620 1.157157
33.831036 -0.113495 1.157169
33.832035 -0.113365 1.157191
33.833035 -0.113242 1.157228
33.834034 -0.113157 1.157273
33.835033 -0.113071 1.157300
第一列包含按升序排列的浮点数,假设我想删除后面的所有行,33.832035
因此输出应该是:
33.829037 -0.113737 1.157153
33.830036 -0.113620 1.157157
33.831036 -0.113495 1.157169
33.832035 -0.113365 1.157191
如何使用sed
适当的文本处理工具来做到这一点?
我试过了删除行中第一次出现字符串后的所有行但在我的案例中没有成功实施。
答案1
链接问题的一个解决方案的一个轻微变体将包括第一个匹配行:
sed '/33.832035/q'
这将打印所有行,包括包含“33.832035”的第一行,然后退出。
任何其他文本处理语言都会有类似的等价物;例如在 AWK 中:
awk '1; /33.832035/ { exit }'
这将打印每一行(1
,它始终匹配并导致 AWK 应用其默认操作,即打印当前行),并在当前行匹配“33.832035”时退出。
在这两种情况下,您都可以使正则表达式更具限制性,例如 /^33.832035 /
仅匹配行开头的完整字段。
答案2
Awk
方法:
awk '$1 == 33.832035{ print; exit }1' file
示例输出:
33.829037 -0.113737 1.157153
33.830036 -0.113620 1.157157
33.831036 -0.113495 1.157169
33.832035 -0.113365 1.157191