2012-12-26 45 views

Trả lời

17

tôi có lẽ muốn sử dụng sed cho việc làm này :

line=3 
sed -e "${line}r file2" file1 

Nếu bạn đang tìm cách ghi đè file1 và bạn có GNU sed, hãy thêm tùy chọn -i. Nếu không, hãy ghi vào một tệp tạm thời và sau đó sao chép/di chuyển tệp tạm thời trên tệp gốc, dọn dẹp khi cần thiết (đó là công cụ trap bên dưới). Lưu ý: sao chép tạm thời trên tập tin giữ liên kết; di chuyển không (nhưng là swifter, đặc biệt là nếu tập tin là lớn).

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 
+0

cảm ơn m8, điều đó sẽ làm được! –

1
cat file1 >>file2 

sẽ nối nội dung của tệp1 vào tệp2.

cat file1 file2 

sẽ nối tập tin1 và tệp2 và gửi đầu ra tới đầu cuối.

cat file1 file2 >file3 

sẽ tạo hoặc file3 overwite với nối của file1 và file2

sẽ nối nối của file1 và file2 file3 đến cuối.

Sửa:

Đối trunking file2 trước khi thêm file1:

sed -e '11,$d' -i file2 && cat file1 >>file2 

hoặc để thực hiện một 500 dòng file:

n=$((500-$(wc -l <file1))) 
sed -e "1,${n}d" -i file2 && cat file1 >>file2 
+0

Tôi biết rằng (không muốn âm thanh thô lỗ) những gì tôi muốn làm là cat file1 >> file2 nhưng "mèo" nó vào một dòng nhất định của tệp2. Bạn có ý tưởng làm thế nào để làm điều đó? Bạn sẽ làm cho ngày của tôi! –

+0

Tất nhiên, file1 có ít hơn 500 dòng trong mẫu cuối cùng của tôi! – techno

7

Chỉ cần cho vui, và chỉ bởi vì tất cả chúng ta yêu thương ed, trình soạn thảo chuẩn, đây là một phiên bản ed. Rất hiệu quả (edchính hãng trình chỉnh sửa văn bản)!

ed -s file2 <<< $'3r file1\nw' 

Nếu số dòng được lưu trữ trong biến line thì:

ed -s file2 <<< "${line}r file1"$'\nw' 

Chỉ cần để làm hài lòng Zack, đây là một phiên bản với ít bashism, trong trường hợp bạn không thích bash (cá nhân tôi, tôi không thích ống và subshells, tôi thích herestrings, nhưng hey, như tôi đã nói, đó là chỉ để làm hài lòng Zack):

printf "%s\n" "${line}r file1" w | ed -s file2 

hoặc (để làm hài lòng Sorpigal):

printf "%dr %s\nw" "$line" file1 | ed -s file2 

Như Jonathan Leffler đề cập trong một bình luận, và nếu bạn có ý định sử dụng phương pháp này trong một kịch bản, sử dụng một heredoc (nó thường là hiệu quả nhất):

ed -s file2 <<EOF 
${line}r file1 
w 
EOF 

Hope this helps!

P.S. Đừng ngần ngại để lại một bình luận nếu bạn cảm thấy bạn cần phải thể hiện bản thân về những cách để lái xe ed, trình soạn thảo chuẩn.

+0

Điều này là thông minh, nhưng nếu tôi upvote bất cứ điều gì mà sử dụng 'ed' và bashisms trong cùng một hơi thở, tôi bị mất tình trạng râu cũ của tôi. 'printf '3r file1 \ nw' | ed-file2', làm ơn. – zwol

+0

@Zack đã chỉnh sửa cho phù hợp ';-) ' –

+0

Tài liệu kiểu cũ ở đây (' << EOF') sẽ hoạt động thay vì '<<<' Bashism. –

1

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" ; } 

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ác vấn đề liên quan