如何将文件的其余行复制到另一个文件

如何将文件的其余行复制到另一个文件

我有一个字符串xyz,它是 in 中的一行file1.txt,我想将xyzin后面的所有行复制file1.txt到一个新文件中file2.txt。我怎样才能实现这个目标?

我知道cat指挥。但如何指定起始线呢?

答案1

使用 GNU sed

复制所有行 xyz, 尝试:

sed '0,/xyz/d' file1.txt >file2.txt

1,/xyz/指定从第一行开始到第一次出现匹配的行结束的行范围xyzd告诉 sed 删除这些行。

笔记:对于 BSD/MacOS sed,可以使用,sed '1,/xyz/d' file1.txt >file2.txt但这仅在 第一次出现xyz在第二行或更晚的情况下才有效。 (帽子提示:善行.)

另一种方法,如建议的唐克里斯斯蒂,应该适用于全部sed:

{ printf %s\\n; cat file1.txt; } | sed '1,/xyz/d' >file2.txt

例子

考虑这个测试文件:

$ cat file1.txt
a
b
xyz
c
d

运行我们的命令:

$ sed '1,/xyz/d' file1.txt >file2.txt
$ cat file2.txt
c
d

使用 awk

相同的逻辑可以用于 awk:

awk 'NR==1,/xyz/{next} 1' file1.txt >file2.txt

NR==1,/xyz/{next}告诉 awk 跳过从第一个 ( NR==1) 到与正则表达式匹配的第一行的所有行xyz1告诉 awk 打印所有剩余的行。

答案2

ed

ed -s file.txt <<< $'/xyz/+1,$w file2.txt'

ed这会从线路发送一个(远程)命令到:( ) 包含直到文件末尾 ( )+1的行,将这些行写入.xyz$wfile2.txt

答案3

还有 csplit :

csplit -s file1.txt %xyz%1

答案4

$ sed -n '/xyz/,$p' file.txt > file2.txt

我们-n可以防止sed打印每一行。 with$表示文件末尾 endp代表打印行。所以/xyz/$p意味着:如果一行匹配,xyz则将其打印到文件末尾。

相关内容