Rất nhiều cách để làm điều đó, nhưng tôi muốn chọn cách liên quan đến việc tạo công cụ.
Thứ nhất, thiết lập môi trường thử nghiệm
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
Bây giờ chúng ta hãy làm công cụ, và ở đầu tiên vượt qua này, chúng tôi sẽ thực hiện nó nặng.
# 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" ; } ; }
Sau đó, chạy công cụ để xem kết quả tuyệt vời.
$ insert_at /tmp/test/f1 /tmp/test/f2 5
Nhưng chờ đợi, kết quả là trên stdout! Điều gì về việc ghi đè lên bản gốc? Không sao, chúng ta có thể tạo ra một công cụ khác cho điều đó.
insert_at_replace() { tmp=$(mktemp) ; insert_at "[email protected]" > "$tmp" ; mv "$tmp" "$2" ; }
Và chạy nó
$ insert_at_replace /tmp/test/f1 /tmp/test/f2 5
$ cat /tmp/test/f2
"triển khai của bạn sucks!"
Tôi biết, nhưng đó là vẻ đẹp của việc tạo ra các công cụ đơn giản. Hãy thay thế insert_at
bằng phiên bản sed.
insert_at() { insert="$1" ; into="$2" ; at="$3" ; sed -e "${at}r ${insert}" "$into" ; }
Và insert_at_replace
tiếp tục hoạt động (tất nhiên). Việc thực hiện insert_at_replace
cũng có thể được thay đổi để ít bị lỗi hơn, nhưng tôi sẽ để điều đó như một bài tập cho người đọc.
cảm ơn m8, điều đó sẽ làm được! –