我尝试使用它,cat
然后在键入我添加的第二个文件后| head -$line | tail -1
,它不起作用,因为它cat
首先执行。
有任何想法吗?我需要用cat
其他东西来做。
我可能会sed
用于这项工作:
line=3
sed -e "${line}r file2" file1
如果您要覆盖file1
并且拥有 GNU sed
,请添加该-i
选项。否则,写入临时文件,然后将临时文件复制/移动到原始文件上,必要时进行清理(即trap
下面的内容)。注意:将临时文件复制到文件上会保留链接;移动不会(但更快,尤其是在文件很大的情况下)。
line=3
tmp="./sed.$$"
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
sed -e "${line}r file2" file1 > $tmp
cp $tmp file1
rm -f $tmp
trap 0
只是为了好玩,也只是因为我们都喜欢ed
标准编辑器,这里有一个ed
版本。它非常高效(ed
是一个真正的文本编辑器)!
ed -s file2 <<< $'3r file1\nw'
如果行号存储在变量中,line
则:
ed -s file2 <<< "${line}r file1"$'\nw'
只是为了取悦 Zack,这是一个较少 bashism 的版本,以防你不喜欢 bash(就我个人而言,我不喜欢管道和 subshells,我更喜欢 herestrings,但是嘿,正如我所说,这只是为了取悦 Zack):
printf "%s\n" "${line}r file1" w | ed -s file2
或(为了取悦 Sorpigal):
printf "%dr %s\nw" "$line" file1 | ed -s file2
正如 Jonathan Leffler 在评论中提到的那样,如果您打算在脚本中使用此方法,请使用 heredoc(它通常是最有效的):
ed -s file2 <<EOF
${line}r file1
w
EOF
希望这可以帮助!
ed
PS 如果您觉得需要表达自己关于驾驶方式的标准编辑器,请不要犹豫发表评论。
cat file1 >>file2
将file1的内容附加到file2。
cat file1 file2
将连接 file1 和 file2 并将输出发送到终端。
cat file1 file2 >file3
将通过 file1 和 file2 的连接创建或覆盖 file3
cat file1 file2 >>file3
将 file1 和 file2 的连接附加到 file3 的末尾。
编辑:
对于添加 file1 之前的中继 file2:
sed -e '11,$d' -i file2 && cat file1 >>file2
或制作一个 500 行的文件:
n=$((500-$(wc -l <file1)))
sed -e "1,${n}d" -i file2 && cat file1 >>file2
有很多方法可以做到,但我喜欢选择一种涉及制作工具的方法。
一、搭建测试环境
rm -rf /tmp/test
mkdir /tmp/test
printf '%s\n' {0..9} > /tmp/test/f1
printf '%s\n' {one,two,three,four,five,six,seven,eight,nine,ten} > /tmp/test/f2
现在让我们制作工具,在这第一遍中,我们将糟糕地实现它。
# insert contents of file $1 into file $2 at line $3
insert_at () { insert="$1" ; into="$2" ; at="$3" ; { head -n $at "$into" ; ((at++)) ; cat "$insert" ; tail -n +$at "$into" ; } ; }
然后运行该工具以查看惊人的结果。
$ insert_at /tmp/test/f1 /tmp/test/f2 5
但是等等,结果在标准输出上!覆盖原来的怎么办?没问题,我们可以为此制作另一个工具。
insert_at_replace () { tmp=$(mktemp) ; insert_at "$@" > "$tmp" ; mv "$tmp" "$2" ; }
并运行它
$ insert_at_replace /tmp/test/f1 /tmp/test/f2 5
$ cat /tmp/test/f2
“你的实施很糟糕!”
我知道,但这就是制作简单工具的美妙之处。让我们替换insert_at
为 sed 版本。
insert_at () { insert="$1" ; into="$2" ; at="$3" ; sed -e "${at}r ${insert}" "$into" ; }
并insert_at_replace
继续工作(当然)。的实现insert_at_replace
也可以更改为减少错误,但我将把它作为练习留给读者。
如果您不介意管理新文件head
,我喜欢这样做:tail
head -n 16 file1 > file3 &&
cat file2 >> file3 &&
tail -n+56 file1 >> file3
如果你愿意,你可以把它折叠成一行。然后,如果您真的需要它来覆盖 file1,请执行以下操作
mv file3 file1
:(可选地包含&&
在命令之间)。
笔记:
head -n 16 file1
表示 file1 的前 16 行tail -n+56 file1
表示 file1 从第 56 行开始到结尾head
和tail
命令,然后尝试一个魔术sed
命令。