我有一个字符串xyz
,它是 in 中的一行file1.txt
,我想将xyz
in后面的所有行复制file1.txt
到一个新文件中file2.txt
。我怎样才能实现这个目标?
我知道cat
指挥。但如何指定起始线呢?
答案1
使用 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
在第二行或更晚的情况下才有效。 (帽子提示:善行.)
另一种方法,如建议的唐克里斯斯蒂,应该适用于全部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 打印所有剩余的行。
答案2
和ed
:
ed -s file.txt <<< $'/xyz/+1,$w file2.txt'
ed
这会从线路发送一个(远程)命令到:后( ) 包含直到文件末尾 ( )+1
的行,将这些行写入.xyz
$
w
file2.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
则将其打印到文件末尾。