2011-11-03 52 views
3

說我有一個行數開始foobar如何將'foobar'開頭的所有行移動到文件末尾?

一個劇本,我想所有的線移動到文檔的末尾,同時保持它們的順序

例如從去:

# There's a Polar Bear 
# In our Frigidaire-- 
foobar['brangelina'] <- 2 
# He likes it 'cause it's cold in there. 
# With his seat in the meat 
foobar['billybob'] <- 1 
# And his face in the fish 

# There's a Polar Bear 
# In our Frigidaire-- 
# He likes it 'cause it's cold in there. 
# With his seat in the meat 
# And his face in the fish 
foobar['brangelina'] <- 2 
foobar['billybob'] <- 1 

這是據我已經得到了:

grep foobar file.txt > newfile.txt 
sed -i 's/foobar//g' foo.txt 
cat newfile.txt > foo.txt 
+2

提示:輸出文件就是所有的行不foobar的開始,接着用foobar的開頭的所有行。兩個grep命令。 – Amnon

+0

@Amnon謝謝你指出。有道理,但我仍然不知道如何說bash – Abe

+0

@Amnon'-v'得到了它 – Abe

回答

3

這可能會實現:

sed '/^foobar/{H;$!d;s/.*//};$G;s/\n*//' input_file 

編輯:修訂的角落情況下foobar是最後一行

+0

差異顯示它與其他兩個相同,但一個班輪需要它(除非有更真棒的東西出現)。如果你能解釋什麼是「{H; d}; $ G; s/\ n /',那就太好了。 – Abe

+1

所有不包含字符串foobar的行都會直接通過。那些包含'foobar'的行被添加到一個名爲保持空間的寄存器中,然後模式空間(當前行)被刪除。在最後一行'$'保留空間(包含所有foobar行)被附加到模式空間,準備打印,但首先刪除空行。 – potong

2
grep -v ^foobar file.txt > file1.txt 
grep ^foobar file.txt > file2.txt 
cat file2.txt >> file1.txt 
2

這樣做:

grep -v ^foobar file.txt > tmp1.txt 
grep ^foobar file.txt > tmp2.txt 
cat tmp1.txt tmp2.txt > newfile.txt 
rm tmp1.txt tmp2.txt 

-v選項返回所有給定的模式匹配的行。 ^標誌着一行的開始,因此^foobar匹配行開頭foobar

+0

爲什麼是克拉? –

+0

@David因爲安倍希望從** foobar開始移動**行,而'^'標記行的開頭。 – Bolo

+0

謝謝...和+1我已更新我的回答 –

2
grep -v ^foobar file.txt >newfile.txt 
grep ^foobar file.txt >>newfile.txt 

不需要臨時文件

+0

,這是行不通的,不僅因爲你拼錯grerp – Abe

+0

安倍:那麼請告訴我爲什麼,因爲它似乎在我的機器上工作正常 –

+0

你有兩個不同的輸出文件名。 – tripleee

1

您也可以這樣做:

vim file.txt -c 'g/^foobar/m$' -c 'wq' 

-c開關裝置Ex命令下文中,g命令在含有給定的圖案的所有行操作,並且這裏的動作是m$這意味着「移動到文件結尾」(它保留了順序)。 wq weans「保存並退出vim」。

如果速度太慢,還可以阻止VIM讀取的vimrc:

vim -u NONE file.txt -c 'g/^foobar/m$' -c 'wq' 
相關問題