user9371654 Asked: 2019-03-10 13:28:41 +0800 CST2019-03-10 13:28:41 +0800 CST 2019-03-10 13:28:41 +0800 CST 如何将文件的其余行复制到另一个文件[重复] 772 我有一个字符串xyz,它是一行file1.txt,我想将 in 之后xyz的所有行复制file1.txt到一个新文件file2.txt中。我怎样才能做到这一点? 我知道cat命令。但是如何指定起跑线呢? grep files 4 个回答 Voted Best Answer John1024 2019-03-10T13:38:45+08:002019-03-10T13:38:45+08:00 使用 GNU sed 要复制之后 xyz的所有行,请尝试: sed '0,/xyz/d' file1.txt >file2.txt 1,/xyz/指定从第一个匹配的第一个匹配项开始到第一个匹配项结束的行范围xyz。 d告诉 sed 删除这些行。 注意:对于 BSD/MacOS sed,可以使用sed '1,/xyz/d' file1.txt >file2.txt,但这仅在第一次出现xyz在第二行或更晚时才有效。(帽子提示:kusalananda。) don_crissti建议的另一种方法应该适用于所有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) 到匹配正则表达式的第一行的所有行xyz。 1告诉 awk 打印任何剩余的行。 Jeff Schaller 2019-03-10T14:38:41+08:002019-03-10T14:38:41+08:00 与ed: ed -s file.txt <<< $'/xyz/+1,$w file2.txt' 这会将一个(范围)命令发送到ed:从( )之后的行到文件末尾 ( ),将这些行写入.+1xyz$wfile2.txt ctac_ 2019-03-10T14:29:30+08:002019-03-10T14:29:30+08:00 还有 csplit : csplit -s file1.txt %xyz%1 finswimmer 2019-03-10T13:38:29+08:002019-03-10T13:38:29+08:00 $ sed -n '/xyz/,$p' file.txt > file2.txt -n我们防止sed打印每一行。With$表示文件 endp代表打印行。所以/xyz/$p意味着:如果一行匹配xyz,则打印它直到文件末尾。
使用 GNU sed
要复制之后
xyz
的所有行,请尝试:1,/xyz/
指定从第一个匹配的第一个匹配项开始到第一个匹配项结束的行范围xyz
。d
告诉 sed 删除这些行。注意:对于 BSD/MacOS sed,可以使用
sed '1,/xyz/d' file1.txt >file2.txt
,但这仅在第一次出现xyz
在第二行或更晚时才有效。(帽子提示:kusalananda。)don_crissti建议的另一种方法应该适用于所有sed:
例子
考虑这个测试文件:
运行我们的命令:
使用 awk
awk 可以使用相同的逻辑:
NR==1,/xyz/{next}
告诉 awk 跳过从第一个 (NR==1
) 到匹配正则表达式的第一行的所有行xyz
。1
告诉 awk 打印任何剩余的行。与
ed
:这会将一个(范围)命令发送到
ed
:从( )之后的行到文件末尾 ( ),将这些行写入.+1
xyz
$
w
file2.txt
还有 csplit :
-n
我们防止sed
打印每一行。With$
表示文件 endp
代表打印行。所以/xyz/$p
意味着:如果一行匹配xyz
,则打印它直到文件末尾。