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

时间:2013-02-03 20:04:41

标签: regex grep whitespace

我有一个文本文件,格式如下:

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 个答案:

答案 0 :(得分:27)

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

请改为: -

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

或更好: -

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

\S表示匹配非空白字符。锚^用于匹配行的开头。

答案 1 :(得分:12)

我意识到这一点早已得到了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

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

答案 2 :(得分: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

但是非日期标记的行显示 的问题。没有着色就很难看到这个......

答案 3 :(得分:0)

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

<!DOCTYPE html>
<html>
<body>

<ul id="myList1"><li>Coffee</li><li>Tea</li></ul>
<ul id="myList2">
  <li>Water</li>
  <li>Milk</li>
</ul>

<p>Click the button to copy an item from one list to another.</p>

<button onclick="myFunction()">Try it</button>

<script>
function myFunction() {
  var itm = document.getElementById("myList2").lastChild;
  var cln = itm.cloneNode(true);
  document.getElementById("myList1").appendChild(cln);
}
</script>

</body>
</html>