我有一个文本文件,格式如下:
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
答案 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
awk
比grep
快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>