在冒号之前获取内容


8

我在Linux上有一个文本文件,其内容如下:

help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com

我想在冒号之前获取内容,如下所示:

help.helloworld.com
dev.helloworld.com

我该如何在终端机中做到这一点?


2
grep实用程序用于查找与正则表达式匹配的行。您可以在这里使用它,但是使用从给定分隔符的字段中提取数据的工具(例如cut实用程序)会更合适。
库萨兰达

我提交了一个编辑,以删除单词“ grep”,并在标题中将其替换为“ find”,在问题正文中将其替换为“ get”,以避免X / Y问题假设grep是解决实际问题的正确工具问题。
蒙蒂·哈德

1
我只能说冒号之前的内容比冒号之后的内容好;-)。
彼得-恢复莫妮卡

Answers:


35

cut是为了:

$ cat file
help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
foo:baz:bar
foo

$ cut -d: -f1 file
help.helloworld.com
dev.helloworld.com
foo
foo

您只需将定界符设置为:with,-d:并告诉它仅打印第一个字段(-f1)。


19

或替代方法:

$ grep -o '^[^:]*' file
help.helloworld.com
dev.helloworld.com

这将返回从每行(^)开头开始的所有字符,这些字符不是冒号([^:]*)。


18

绝对会推荐awk

awk -F ':' '{print $1}' file

用途:作为一个字段分隔符,并打印第一个字段。


5

更新的答案

考虑以下文件file.txt

help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
no.colon.com
colon.at.the.end.com:

您可以使用sed删除冒号后的所有内容:

sed -e 's/:.*//' file.txt

这适用于注释中指出的所有极端情况(如果它以冒号结尾或没有冒号,尽管问题本身未提及)。感谢@Rakesh Sharma,@ mirabilos和@Freddy的评论。回答问题是学习的好方法。


4
sed -e 's/:.*//' file.txt是Posix sed的另一种方式。
Rakesh Sharma

1
sed -ne 'y/:/\n/;P' file.txt也可以使用。
Rakesh Sharma

制作.+.*
拉克什·夏尔马

@Randy Joselyn由于语法中有一个隐式内容if,因此s///p您需要修改正则表达式以处理没有冒号的行,例如sed -nEe 's/([^:]*)(:.*|)/\1/p'。请注意,这是必需的,GNU sed但是由于无论如何您都在使用GNU sed,所以这无关紧要。
Rakesh Sharma

这个答案可能是我最喜欢的,但是ERE是不必要的。sed -n '/:/s/^\([^:]*\):.*$/\1/p--posix如果您使用GNU sed,则添加它,只是为了尽管使用了它们的扩展性)
mirabilos

4

需要GNU grep。它不适用于macOS或任何其他BSD上的默认grep。

你的意思是这样的:

grep -oP '.*(?=:)' file

输出:

help.helloworld.com
dev.helloworld.com

4
如果一行上有两个或多个冒号,它将打印所有内容,直到最后一个,而不是OP所需的内容。尝试echo foo:bar:baz | grep -oP '.*(?=:)'。这将适用于OP的示例,但不适用于问题中描述的一般情况。
terdon

只有一个冒号,并且工作正常,但感谢您的更新
Gabrial Johnas


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.