String 如何移动从';开始的所有行;foobar&x27;到文件的结尾?

String 如何移动从';开始的所有行;foobar&x27;到文件的结尾?,string,bash,String,Bash,假设我有一个脚本,其中有许多行以foobar 我想将所有行移到文档末尾,同时保持它们的顺序 e、 g.从: # 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

假设我有一个脚本,其中有许多行以
foobar

我想将所有行移到文档末尾,同时保持它们的顺序

e、 g.从:

# 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
这可能会奏效:

sed '/^foobar/{H;$!d;s/.*//};$G;s/\n*//' input_file
编辑:当
foobar
位于最后一行时,对拐角处的情况进行了修改

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
开头的行

grep -v ^foobar file.txt >newfile.txt
grep ^foobar file.txt >>newfile.txt
不需要临时文件

您还可以执行以下操作:

vim file.txt -c 'g/^foobar/m$' -c 'wq'
-c
开关意味着一个Ex命令紧跟其后,
g
命令在包含给定模式的所有行上运行,操作在这里是
m$
,这意味着“移动到文件末尾”(它保留顺序)<代码>wq断开“保存并退出vim”

如果速度太慢,还可以阻止vim读取vimrc:

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

提示:输出文件只是以foobar开头的所有行,后面是以foobar开头的所有行。两个grep命令。@Amnon感谢您指出这一点。这是有道理的,但我仍然不知道如何在bashdiff节目中说“不”,它与其他两个节目是一样的,但一行接受了它(除非出现更可怕的节目)。如果你能解释一下
{H;d}$Gs/\n/
不包含,以获得额外的积分。所有不包含字符串
foobar
的行都直接通过。包含
foobar
的行被追加到称为保持空间的寄存器中,然后删除模式空间(当前行)。在最后一行
$
中,保留空间(包含所有foobar行)被追加到图案空间,准备打印,但首先删除了一个空行。@David,因为Abe想移动以foobar开头的行,并且
^
标记行的开头。Abe:那么请告诉我为什么,因为它似乎在我的机器上工作得很好。你有两个不同的输出文件名。LOL,最后我发现我应该得到-1。也在修复它。@Dadam现在我明白你关于没有临时文件的观点了。感谢您没有正确使用grep。。而且你不能用你的文件作为输入。。这就是sed的全部原因-我转换了。。
grep -v ^foobar file.txt >newfile.txt
grep ^foobar file.txt >>newfile.txt
vim file.txt -c 'g/^foobar/m$' -c 'wq'
vim -u NONE file.txt -c 'g/^foobar/m$' -c 'wq'