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表示匹配非空白字符.并且锚^用于在行的开头匹配.
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倍比速度更快.同样,这个小文件对于一次运行没有太大区别,但如果您正在编写脚本,例如,为了重复使用,或者经常在大型文件上执行此操作,您可能会欣赏额外的效率.