您的sed命令的问题在于,您将“所有后面跟着空格的东西”(“。*”)替换为“空白”。你需要做的是把所有东西都抓到第一个空间并保存,然后用保存的位替换所有的东西。要保存部分输入字符串,请将该部分正则表达式放在括号内:(.*)
然后可以使用\1
将其置于替换字符串中。
但还有更多。 sed是贪婪的 - 它会尽可能地抓住它。所以当你得到一个像“abc def ghi”这样的字符串时,它会看到“abc def”后面跟着一个空格并抓住所有这些。所以问题是,你如何得到第一部分,直到第一个空间?
您可以选择不是您的分隔符(空格)后面跟空格的所有字符。所以在上面的例子中,因为c和d之间的字符是空格,所以不会被选中,只有部分会被选中。
所以你最终这是什么:
sed "s/\([^ ]*\) .*/\1/"`
其中,匹配模式由“任何东西,这不是一个空间,多则有”(即括号中保存它)"([^ ]\*)"
的,单个空间" "
,然后是其他任何东西".*"
。替换字符串"\1"
是“与第一组括号中的正则表达式部分匹配的任何内容”。
下面是一个简单的测试,我做的事:
Testing: cat testout.txt
cat: testout.txt: No such file or directory
Testing: cat testin.txt
abc def ghi
asdf jkl; fdsa ;lkj qwerty 123
Once upon a time
When in the course
Testing: cat testin.txt | sed "s/\([^ ]*\) .*/\1/" >> testout.txt
Testing: cat testout.txt
abc
asdf
Once
When
Testing: cat testin.txt | sed "s/\([^ ]*\) .*/\1/" >> testout.txt
Testing: cat testout.txt
abc
asdf
Once
When
abc
asdf
Once
When
Testing:
它一无所有开始了在testout.txt和4线testin.txt。然后它将testin.txt的内容发送到sed,输出附加到文件中。然后显示内容。我再次做了它,然后,显示它是真的追加(现在有12行,在testout.txt,两套4.)(注意:我添加了空白行以方便阅读。)
如果您有任何问题,请让我知道。
希望这会有所帮助!
非常welll解释,谢谢! – GeorgeOfTAC