29

我有一个具有以下格式的文本文件:

characters(that I want to keep) (space) characters(that I want to remove)

例如:

foo garbagetext
hello moregarbage
keepthis removethis
(etc.)

所以我试图在 Linux 中使用 grep 命令来只保留每行中的字符,不包括第一个空格。我尝试了很多尝试,例如:

grep '*[[:space:]]' text1.txt > text2.txt
grep '*[^\s]' text1.txt > text2.txt
grep '/^[^[[:space:]]]+/' text1.txt > text2.txt

试图从不同的例子中拼凑起来,但我没有运气。他们都产生一个空白text2.txt文件。我是新来的。我究竟做错了什么?

*编辑:

我要保留的部分包括大写字母。所以我想在每一行中保留任何/所有字符,但不包括空格(从空格开始删除所有内容)。

**编辑:

垃圾文本(我想删除)可以包含任何内容,包括空格、特殊字符等。例如:

AA rough, cindery lava [n -S]

运行后grep -o '[^ ]*' text1.txt > text2.txt,上面的行变为:

AA
rough,
cindery
lava
[n
-S]

在 text2.txt 中。(我只想保留AA


解决方案(由 Rohit Jain 提供,由 beny23 提供进一步输入):

 grep -o '^[^ ]*' text1.txt > text2.txt
4

4 回答 4

43

您将量词*放在错误的位置。

试试这个: -

grep '^[^\s]*' text1.txt > text2.txt

或者,甚至更好:-

grep '^\S*' text1.txt > text2.txt  

\S表示匹配非空白字符。并且锚点^用于匹配行首。

于 2013-02-03T20:06:24.267 回答
17

我意识到这个问题早已用 grep 解决方案得到了解答,但对于后代,我想指出,对于这种特殊情况,至少还有两个其他解决方案,这两个解决方案都比 grep 更有效。

由于您没有进行任何复杂的文本模式匹配,只取用空格分隔的第一列,您可以使用一些基于列的实用程序,例如 awk 或 cut。

使用 awk

$ awk '{print $1}' text1.txt > text2.txt

使用剪切

$ cut -f1 -d' ' text1.txt > text2.txt

~1.1MB 文件的基准测试

$ time grep -o '^[^ ]*' text1.txt > text2.txt

real    0m0.064s
user    0m0.062s
sys     0m0.001s
$ time awk '{print $1}' text1.txt > text2.txt

real    0m0.021s
user    0m0.017s
sys     0m0.004s
$ time cut -f1 -d' ' text1.txt > text2.txt

real    0m0.007s
user    0m0.004s
sys     0m0.003s

awk比 快大约 3 倍grep,并且cut比那快大约 3 倍。同样,这个小文件只运行一次并没有太大区别,但是如果您正在编写一个脚本,例如,为了重复使用,或者经常在大文件上执行此操作,您可能会欣赏额外的效率。

于 2013-08-13T18:32:41.307 回答
0

我经常使用 egrep 来帮助“着色”日志行,所以我一直在寻找正则表达式的新变化。对我来说,通过添加这样的 \W ,上述效果会更好:

$ egrep --color '^\S*\W|bag' /tmp/barf -o
foo
bag
hello
bag
keepthis
(etc.)

问题是,我的日志文件几乎总是带有时间戳,所以我在示例文件中添加了一行:

2013-06-11 date stamped line

然后它就不能很好地工作了。所以我恢复到我以前的正则表达式:

egrep --color '^\w*\b|bag' /tmp/barf

但是没有日期戳的行显示了问题。没有着色很难看到这个......

于 2013-06-12T03:47:30.337 回答
0

跟进@Steve 的回答,如果您想使用不同的分隔符(例如逗号),您可以使用-F 指定它。如果您希望每行的内容直到第一个逗号,这将很有用,例如在尝试读取 csv 文件中第一个字段的值时。

$ awk -F "," '{print $1}' text1.txt > text2.txt
于 2019-08-31T05:36:34.147 回答