2009-03-31 62 views
5

Tôi có một tệp văn bản 2 GB trên hộp linux của mình mà tôi đang cố gắng nhập vào cơ sở dữ liệu của mình.Làm cách nào để thay thế một dòng cụ thể theo số dòng trong tệp văn bản?

Vấn đề tôi đang gặp là kịch bản đó là xử lý tập tin rdf này đang làm tắc nghẽn trên một dòng:

mismatched tag at line 25462599, column 2, byte 1455502679: 
<link r:resource="http://www.epuron.de/"/> 
<link r:resource="http://www.oekoworld.com/"/> 
</Topic> 
=^ 

Tôi muốn thay thế </Topic> với </Line>. Tôi không thể tìm kiếm/thay thế trên tất cả các dòng nhưng tôi có số dòng vì vậy tôi hy vọng có một số cách dễ dàng để chỉ thay thế một dòng với văn bản mới.

Bất kỳ ý tưởng/đề xuất nào?

Trả lời

11
sed -i yourfile.xml -e '25462599s!</Topic>!</Line>!' 
+0

Điều đó không hiệu quả nếu thẻ mở cũng nằm trên cùng một dòng ... –

+0

Bắt tốt. Đã sửa. – chaos

+0

Chạy ngay bây giờ. Cảm ơn! – GeoffreyF67

7
sed -i '25462599 s|</Topic>|</Line>|' nameoffile.txt 
2

Sử dụng "đầu" để có được 25.462.598 dòng đầu tiên và sử dụng "đuôi" để có được những dòng còn lại (bắt đầu từ 25.462.601). Mặc dù ... đối với tệp 2GB, điều này có thể sẽ mất một lúc. Ngoài ra, bạn có chắc chắn vấn đề là chỉ với dòng đó và không phải một nơi nào đó trước đó (ví dụ như các lỗi trông giống như một lỗi phân tích cú pháp XML có thể có nghĩa là vấn đề thực tế là một nơi nào đó khác).

+0

Các thẻ dòng tự đóng, vì vậy cần thêm vào một nơi khác ... –

+0

Điều đó khiến tôi nhìn và đó thực sự là ExternalPage mà tôi cần để thay thế. Cảm ơn! – GeoffreyF67

5

Các công cụ để chỉnh sửa văn bản file trong Unix, được gọi là ed (như trái ngược với sed, mà như tên của nó là một trình soạn thảo dòng).

ed đã từng được dùng làm trình chỉnh sửa tương tác nhưng cũng có thể dễ dàng viết kịch bản. Cách ed hoạt động, là tất cả các lệnh đều có tham số địa chỉ. Cách để giải quyết một dòng cụ thể chỉ là số dòng và cách thay đổi (các) dòng được giải quyết là lệnh s, có cùng giá trị regexp là sed. Vì vậy, để thay đổi dòng 42, bạn sẽ viết một cái gì đó như 42s/old/new/.

Dưới đây là toàn bộ lệnh:

FILENAME=/path/to/whereever 
LINENUMBER=25462599 

ed -- "${FILENAME}" <<-HERE 
    ${LINENUMBER}s!</Topic>!</Line>! 
    w 
    q 
HERE 

Ưu điểm của việc này là ed là tiêu chuẩn, trong khi -i cờ để sed là một phần mở rộng GNU độc quyền mà không có sẵn trên một lô đất của hệ thống.

1

Kịch bản của tôi shell:

#!/bin/bash 
awk -v line=$1 -v new_content="$2" '{ 
     if (NR == line) { 
       print new_content; 
     } else { 
       print $0; 
     } 
}' $3 

Arguments:

first: line number you want change 
second: text you want instead original line contents 
third: file name 

này in ra kịch bản đầu ra thiết bị xuất chuẩn thì bạn cần phải chuyển hướng. Ví dụ:

./script.sh 5 "New fifth line text!" file.txt 

Bạn có thể cải thiện nó, ví dụ: bằng cách lưu ý rằng tất cả các đối số của bạn đã có giá trị kỳ vọng.

Các vấn đề liên quan