您的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