Làm cách nào để thay thế một từ bên trong tệp .DOCX bằng dòng lệnh Linux?


7

Tôi muốn thay đổi một từ trong tệp .docx bằng lệnh shell. Tôi đã thử sử dụng sedlệnh, nhưng nó không hoạt động. Có ai biết một giải pháp cho điều này?

Ví dụ: tôi muốn thay đổi một từ (ví dụ exp5) và thay thế từ đó bằng một từ khác ( exp3) trong tệp exo.docx.


xin lỗi, exp5 với exp3
deepshikha

3
Bạn có thể chỉnh sửa câu hỏi của bạn.
Raphael AhDR

7
.docxthực sự là một kho lưu trữ định dạng zip. Giải nén word/document.xmltập tin từ nó, áp dụng sed cho nó và thêm nó trở lại vào kho lưu trữ. Wikipedia có nhiều thông tin hơn về định dạng.
Động vật danh nghĩa

2
@Dmitry có rất nhiều lý do hợp lệ sẽ đưa chúng ta ra xa chủ đề. Tôi chắc chắn google sẽ giúp bạn
Darren H

1
@DarrenH Tôi không hỏi "rất nhiều lý do hợp lệ", chỉ vì lý do OP có.
Dmitry Grigoryev

Câu trả lời:


19

Vì vậy, bạn muốn thay thế mọi thứ trong một định dạng thương hiệu cụ thể? Thoạt nhìn có vẻ tệ, nhưng docxđịnh dạng mới tốt hơn một chút so với docđịnh dạng cũ , vì thực ra đây là tệp ZIP chứa XMLtệp.

Vì vậy, câu trả lời nằm ở việc giải nén nó, sau đó bạn sẽ phải lục lọi các tập tin và tìm ra cái nào để gọi sedvà nén nó lại.

Kiểm tra các tập tin word/document.xmltrong tập tin ZIP.


một lưu ý phụ: "mc" (nửa đêm lệnh) có thể mở và đi "bên trong" các thư mục và tệp của tệp zip, một cách liền mạch. Bạn sẽ có thể bắt đầu mc (mc), sau đó điều hướng đến tệp, Nhập vào nó để "nhập" nội dung của nó, sau đó tìm tệp có liên quan bạn cần thay đổi, chỉnh sửa nó (F3, nếu bộ nhớ của tôi đúng? phải ở dưới cùng màn hình của bạn) lưu nó và thoát (điều hướng lên cho đến khi bạn "thoát" tệp .zip): nó sẽ hỏi bạn có muốn lưu các sửa đổi không. Để làm việc này, bạn có thể phải bảo "mc" xử lý các tệp .docx và .xlsx dưới dạng tệp zip, tuy nhiên
Olivier Dulac

4
Tôi gặp ác mộng về sedXML ....
con mèo


@DigitalTrauma Vâng, đúng hơn là như vậy, mặc dù sedcó thể mô tả các ngữ pháp không thông thường, phải không? Vì vậy, có lẽ nó không quá tệ (nhưng hãy sử dụng trình phân tích cú pháp!)
mèo

1
Thay thế một từ có lẽ sẽ ổn, nếu nó không xuất hiện dưới dạng tên thẻ, nhưng nói chung, sử dụng regex trên xml là không phù hợp và không chính xác theo quan điểm ngữ pháp. Tôi không biết OP muốn gì - nếu nó cần phải là một tập lệnh tự động, thì việc sử dụng trình quản lý tập tin và trình soạn thảo văn bản là điều không cần thiết.
orion

3

thử kịch bản này:

FILE=$1    
RETPATH=`pwd`    
rm -rf /var/tmp/docx    
mkdir /var/tmp/docx    
cp $FILE /var/tmp/docx
cd /var/tmp/docx    
mkdir tmp
unzip $FILE -d tmp
cd tmp/word
sed -i "s/${2}/${3}/" document.xml
cd ..
zip -r ../${FILE} *
cp /var/tmp/docx/${FILE} ${RETPATH}
cd $RETPATH
rm -rf /var/tmp/docx 

và gọi kịch bản như sau:

./repdocx FILE_NAME OLD_STRING NEW_STRING

Nếu sử dụng OSX, đừng quên thêm sed -i ''
Ian Newland

1

Sửa đổi và làm sạch câu trả lời của schraubenkarl (phải có trong thư mục của docx):

find_and_replace() {
    FILE=$1
    FIND=$2
    REPLACE=$3

    unzip $FILE -d tmp #unzip
    sed -i '' -e "s/${FIND}/${REPLACE}/g" tmp/word/document.xml #find/replace
    cd tmp && zip -r ../$i * && cd .. #zip
    rm -rf tmp
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.