2016-02-15 24 views
1

我運行Windows的並具有的GnuWin32工具包,其中包括sed的。具體做法是:如何使用SED僅第一部分隔離文件

C:\ TEMP>的sed --version

GNU sed的版本4.2.1

我有兩個部分的文本文件:固定部分,我想保留,這是一個部分運行作業後附加。

在文件中是一個唯一的字符串,標識添加的部分的開始,並且我想使用Gnu sed來隔離唯一字符串之前的文件部分 - 即,所以我可以附加每次作業運行時都會向固定部分提供不同的數據。

我知道我可以保持固定部分在一個單獨的文件,但增加了複雜性,這將是更優雅,如果我能在同一個文件的開始重用數據。

很久以前我就知道如何設置的sed腳本,我敢肯定,這可以用SED進行,但自那以後我睡了一覺。 :)

能否請您介紹瞭如何使用SED顯示文本的一個文件中的排隊,不包括特定字符串?

例子:

line 1 of fixed portion 
line 2 of fixed portion 
unique string 
line 1 of appended portion 
line 2 of appended portion 
line 3 of appended portion 

我想是看到作爲輸出:

line 1 of fixed portion 
line 2 of fixed portion 

我就得到:

sed -r -n -e "0,/unique string/p" 

但打印獨特的字符串以及。

在此先感謝。

-Noel

回答

2

這應該爲你工作:

sed -n '/unique string/q;p' file 

它在unique string退出處理。其他行被打印。

另一種可能是使用了一系列的地址是這樣的:

sed -n '1,/unique string/{/unique string/!p}' file 

注意sed包括的範圍邊界。我們需要排除unique string打印。

此外,我使用的-n選項使得sed默認情況下禁止輸入行的輸出。


一兩件事,如果unique string可以包含這也是在正則表達式的語法字符的字符...

test* 

...sed可能不再是正確的工具,因爲它只能匹配正則表達式,而不是固定字符串

在這種情況下awk可能是首選的工具:

awk 'index("*unique string*"){exit}1' file 

index("string")返回一個非零值(位置),如果該字符串已被發現。在這種情況下,我們取消對輸入行的進一步處理,也不要打印該行。

尾隨1總是計算爲真,並使awk打印所有行,直到前面的條件適用。

+0

太棒了,謝謝!簡單而直接,有兩個選擇。只要系統允許,我會選擇這個答案作爲答案。 – NoelC

+1

或者,使用GNU sed:'sed'/ unique string/Q'file' –

+0

Sed似乎非常樂意匹配在正則表達式中使用的字符,只要它們被轉義。 在任何情況下,我都可以控制唯一字符串中的內容。 – NoelC

相關問題