grep:匹配所有字符(不包括)第一个空格

lor*_*eed 20 regex whitespace grep

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

characters(that I want to keep) (space) characters(that I want to remove)
Run Code Online (Sandbox Code Playgroud)

例如:

foo garbagetext
hello moregarbage
keepthis removethis
(etc.)
Run Code Online (Sandbox Code Playgroud)

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

grep '*[[:space:]]' text1.txt > text2.txt
grep '*[^\s]' text1.txt > text2.txt
grep '/^[^[[:space:]]]+/' text1.txt > text2.txt
Run Code Online (Sandbox Code Playgroud)

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

*编辑:

我要保留的部分包括大写字母.因此,我希望保留所有/所有字符,并且不包括每行中的空白区域(从空白区域移除所有内容).

**编辑:

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

AA rough, cindery lava [n -S]
Run Code Online (Sandbox Code Playgroud)

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

AA
rough,
cindery
lava
[n
-S]
Run Code Online (Sandbox Code Playgroud)

在text2.txt中.(我想保留的是AA)


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

 grep -o '^[^ ]*' text1.txt > text2.txt
Run Code Online (Sandbox Code Playgroud)

Roh*_*ain 32

你把量词*放在错误的地方.

试着改为: -

grep '^[^\s]*' text1.txt > text2.txt
Run Code Online (Sandbox Code Playgroud)

或者,甚至更好: -

grep '^\S*' text1.txt > text2.txt  
Run Code Online (Sandbox Code Playgroud)

\S表示匹配非空白字符.并且锚^用于在行的开头匹配.

  • 您需要添加-o开关才能显示匹配的部分,否则grep会打印整行 (3认同)

Ste*_*eve 14

我意识到这一点早已得到了grep解决方案的回答,但对于后代我还要注意,至少有两种其他解决方案适用于这种特殊情况,这两种解决方案都比grep更有效.

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

使用awk

$ awk '{print $1}' text1.txt > text2.txt
Run Code Online (Sandbox Code Playgroud)

使用剪切

$ cut -f1 -d' ' text1.txt > text2.txt
Run Code Online (Sandbox Code Playgroud)

~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
Run Code Online (Sandbox Code Playgroud)

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