前:
文件1
123
456
文件2
foo
testing
后:
文件1
123
456
文件2
foo
testing 123
任何帮助将不胜感激。
答案1
尝试这个,
sed -i "$ s/$/ $(head -1 file1)/" file2
testing 123
$
编辑文件的最后一行。s/$
将 EOL 替换为$(head -1 file1)
file1 的第一行。
答案2
根据您在示例中给出的内容,这是我向您建议的
echo -en " `head -1 file1`" >> file2
答案3
这项任务并不像乍一看那么明显。
要么使用 Slyx 的代码,然后删除不需要的换行符sed $!N;$s/\n//;P;D
,要么找到一个已知不属于这两个文件的字符串,让我们说=snip=
并做
sed '1h;1,/=snip=/d;$G;s/\n/ /' file1 <( echo =snip=) file2
输出可以通过管道传输到另一个文件,然后复制到file2
(即使您的sed
风格有选项-i
,这在使用两个文件的一部分时也不起作用)。
代码有什么作用?
1h
将第 1 行存储在保留空间( 的“剪贴板”sed
)中以便稍后追加1,/=snip=/d
删除从第 1 行到标记行的所有内容,因此只会file2
打印$G
将保留空间中保存的行追加到最后一行 ($
)s/\n/ /
用空格替换嵌入的换行符。这只会在我们附加保留空间后的最后一行发生file1 <( echo =snip=) file2
文件是否流式传输到sed
:首先file1
提取第一行,然后包含一个虚拟文件=snip=
以了解文件 1 何时结束,最后file2
事实上,这是一个学习sed
技巧的好任务。
答案4
有ed
:
ed file2 <<END
1a
$(head -n 1 file1)
.
1s/$/ /
1,2j
wq
END
但 awk 可能更清楚:
awk -v "f1=$(head -n1 file1):" 'NR == 1 {$0 = $0 FS f1} 1' file2
这不会将 file2 保存到位。为此,您可以使用 GNU awk 来做到这一点
gawk -i inplace -v "f1=$(head -n1 file1):" 'NR == 1 {$0 = $0 FS f1} 1' file2
或使用任何 awk:
awk -v ... file2 > tmpfile2 && mv tmpfile2 file2
另一个呆呆的选择
gawk '
FNR == 1 { if (NR == FNR) {f1 = $0; nextfile} else {$0 = $0 FS f1} }
{print}
' file1 file2