在bash中将一行从一个文件复制到另一个文件

在bash中将一行从一个文件复制到另一个文件,bash,sed,Bash,Sed,我试图从file1复制一行,并使用bash将该行写入file2的第10行 以下是我尝试过的: sed -e '10i' file2 <file1 我不确定你想让你的台词从哪里来,到哪里去,但你可以这样做: sed 'NUMq;d' file1 >>file2 将NUM替换为要从file1追加到file2的行数 编辑 我想这就是你想要的: sed -i .bak "10 i\\ `sed 1q\;d file1` " file2 我不确定你想让你的台词从哪里来,到哪里去,但

我试图从file1复制一行,并使用bash将该行写入file2的第10行

以下是我尝试过的:

sed -e '10i' file2 <file1

我不确定你想让你的台词从哪里来,到哪里去,但你可以这样做:

sed 'NUMq;d' file1 >>file2
将NUM替换为要从file1追加到file2的行数

编辑

我想这就是你想要的:

sed -i .bak "10 i\\
`sed 1q\;d file1`
" file2

我不确定你想让你的台词从哪里来,到哪里去,但你可以这样做:

sed 'NUMq;d' file1 >>file2
将NUM替换为要从file1追加到file2的行数

编辑

我想这就是你想要的:

sed -i .bak "10 i\\
`sed 1q\;d file1`
" file2
如果您使用的是GNU sed,则:

将在insert-here.txt中的第10行之后插入choose-line-here.txt中的第1行

令人惊讶的是,改变第10行似乎更为棘手。到目前为止,我已经想到了这一点:

sed -n 1p choose-line-here.txt |
sed -e '9!b' -e 'N;s/\n.*//;r /dev/stdin' insert-here.txt
棘手的部分是,r命令在当前行之后插入/dev/stdin的内容,即标准输入。如果这是要替换的行,那么我看不出不输出备用新行就可以摆脱它的方法。因此,开始插入前一行的技巧,在本例中是第9行

如果依赖于sed而不计算从stdin新读取的行,则可以使用更简单的方法更改目标行:

sed -n 1p choose-line-here.txt |
sed -i -e '9r /dev/stdin' -e '10d' insert-here.txt
如果您使用的是GNU sed,则:

将在insert-here.txt中的第10行之后插入choose-line-here.txt中的第1行

令人惊讶的是,改变第10行似乎更为棘手。到目前为止,我已经想到了这一点:

sed -n 1p choose-line-here.txt |
sed -e '9!b' -e 'N;s/\n.*//;r /dev/stdin' insert-here.txt
棘手的部分是,r命令在当前行之后插入/dev/stdin的内容,即标准输入。如果这是要替换的行,那么我看不出不输出备用新行就可以摆脱它的方法。因此,开始插入前一行的技巧,在本例中是第9行

如果依赖于sed而不计算从stdin新读取的行,则可以使用更简单的方法更改目标行:

sed -n 1p choose-line-here.txt |
sed -i -e '9r /dev/stdin' -e '10d' insert-here.txt

您可以使用awk执行此操作:

awk 'NR==1{a=$0}NR==FNR{next}FNR==10{print a}1' file1 file2
NR保留总行号的计数。对于第一个文件的第一行,该值仅等于1。行的内容存储在变量a中

FNR保留当前文件的行号计数。NR和FNR是相等的,即我们在文件1中,下一行跳到下一行,这意味着对于第一个文件中的每一行,什么都不会发生

最后一个块在第二个文件的第10行执行,插入a的值。结尾的1是一种常用的速记,这意味着文件的每一行都被打印出来

测试它:

$ cat file1
line 1 in file1
line 2 in file1    
$ cat file2
line 1 in file2
line 2 in file2
line 3 in file2
line 4 in file2
line 5 in file2
line 6 in file2
line 7 in file2
line 8 in file2
line 9 in file2
line 10 in file2
$ awk 'NR==1{a=$0}NR==FNR{next}FNR==10{print a}1' file1 file2
line 1 in file2
line 2 in file2
line 3 in file2
line 4 in file2
line 5 in file2
line 6 in file2
line 7 in file2
line 8 in file2
line 9 in file2
line 1 in file1
line 10 in file2

要覆盖文件2的原始内容,您可以将输出重定向到临时文件,如awk“…”文件1文件2 tmp和&mv tmp文件2。

您可以使用awk:

awk 'NR==1{a=$0}NR==FNR{next}FNR==10{print a}1' file1 file2
NR保留总行号的计数。对于第一个文件的第一行,该值仅等于1。行的内容存储在变量a中

FNR保留当前文件的行号计数。NR和FNR是相等的,即我们在文件1中,下一行跳到下一行,这意味着对于第一个文件中的每一行,什么都不会发生

最后一个块在第二个文件的第10行执行,插入a的值。结尾的1是一种常用的速记,这意味着文件的每一行都被打印出来

测试它:

$ cat file1
line 1 in file1
line 2 in file1    
$ cat file2
line 1 in file2
line 2 in file2
line 3 in file2
line 4 in file2
line 5 in file2
line 6 in file2
line 7 in file2
line 8 in file2
line 9 in file2
line 10 in file2
$ awk 'NR==1{a=$0}NR==FNR{next}FNR==10{print a}1' file1 file2
line 1 in file2
line 2 in file2
line 3 in file2
line 4 in file2
line 5 in file2
line 6 in file2
line 7 in file2
line 8 in file2
line 9 in file2
line 1 in file1
line 10 in file2

要覆盖文件2的原始内容,您可以将输出重定向到临时文件,如awk“…”文件1文件2 tmp和mv tmp文件2。

这可能适用于GNU sed和Bash:

sed $'10{e sed "1!d" file1\n;d}' file2
或者使用管道的另一种方式:

sed '1!d' file1 | sed -e '10{r /dev/stdin' -e 'd}' file2
或者第三种方法可能更直观,但仅适用于单件替换产品线:

sed '10\c'$(sed '1!d' file1) file2

这可能适用于GNU sed和Bash:

sed $'10{e sed "1!d" file1\n;d}' file2
或者使用管道的另一种方式:

sed '1!d' file1 | sed -e '10{r /dev/stdin' -e 'd}' file2
或者第三种方法可能更直观,但仅适用于单件替换产品线:

sed '10\c'$(sed '1!d' file1) file2

@daOnlyDB停止进行巨魔编辑。谢谢。这是您要复制的文件1的第一行吗?文件1是否只包含1行?如果文件2包含例如20行,则需要1行。替换第10行,以便在结果中,文件2或2中仍有20行。在第9行之后插入该行,以便文件2将有21行?两个输入文件的示例和想要的结果将是最好的。@daOnlyDB停止进行troll编辑。谢谢。这是您要复制的文件1的第一行吗?文件1是否只包含1行?如果文件2包含例如20行,则需要1行。替换第10行,以便在结果中,文件2或2中仍有20行。在第9行之后插入该行,以便文件2将有21行?两个输入文件的示例和想要的结果将是最好的2@user27190581q在第一行之后退出。如果我想提取一个不同的行号,比如15,那么15q将输出文件的前15行。在这种情况下;d删除除最后一行以外的所有内容。你说得对,在我看来
1q的情况;d这是不必要的,但第2季度你需要它;d和on。@ldgabbay好的,有意义。我想把第1行放到文件的第10行2@user27190581q在第一行之后退出。如果我想提取一个不同的行号,比如15,那么15q将输出文件的前15行。在这种情况下;d删除除最后一行以外的所有内容。在1q的情况下,你是对的;d这是不必要的,但第2季度你需要它;好的,有道理。很好地增加了音符。第10行之后。要插入第10行,显然要将10r更改为9r。很好的解决方案。好吧,需要更换的线路必须以某种方式消失。但我已经为它添加了一个更简单的解决方案。很好地添加了注释。第10行之后。要插入第10行,显然要将10r更改为9r。很好的解决方案。好吧,需要更换的线路必须以某种方式消失。但我已经添加了一个更简单的解决方案。