Cách chèn một dòng mới cho mỗi lần xuất hiện của từ trừu tượng_ bằng BATCH


0

Tôi có một xml tôi cần chỉnh sửa bằng lô. Làm thế nào để bạn chèn một dòng mới cho mỗi lần xuất hiện của từ trừu tượng_ trong toàn bộ tệp?

Đây là một dòng trong xml (9999999x.xml)

<related-object content-type="image.extract" object-type="image/jpeg" specific-use="data" xlink:href="99999999_abstract_ddd.jpg"/><related-object content-type="image.extract" object-type="image/jpeg" specific-use="data" xlink:href="99999988_abstract_ddd.jpg"/><related-object content-type="image.extract" object-type="image/jpeg" specific-use="data" xlink:href="99999977_abstract_ddd.jpg"/><related-object content-type="image.extract" object-type="image/jpeg" specific-use="data" xlink:href="99999966_abstract_ddd.jpg"/>

Những gì tôi muốn trông giống như ...

<related-object content-type="image.extract" object-type="image/jpeg" specific-use="data" xlink:href="99999999_abstract_
ddd.jpg"/><related-object content-type="image.extract" object-type="image/jpeg" specific-use="data" xlink:href="99999988_abstract_
ded.jpg"/><related-object content-type="image.extract" object-type="image/jpeg" specific-use="data" xlink:href="99999977_abstract_
dfd.jpg"/><related-object content-type="image.extract" object-type="image/jpeg" specific-use="data" xlink:href="99999966_abstract_
dgd.jpg"/>

Nó không phải ghi đè lên tệp, nó chỉ phải được lưu trong một tệp văn bản hoặc tệp tạm thời khác.

Cảm ơn!

Câu trả lời:


0

Tôi đã thấy một sự kết hợp giữa lô và javascript, nơi nó trông giống như một lô nhưng nó thực sự đang chạy javascript. jrepl.bat của Dave Benham http://www.dostips.com/forum/viewtopic.php?f=3&t=6044

Hoặc một chương trình của bên thứ ba như perl hoặc sed. jcop cho thấy re sed. Sed đã cũ, ngày nay người ta sử dụng perl. Liên kết này cho biết cách chuyển đổi một tìm kiếm và thay thế dòng sed, thành perl Perl để khớp với các biểu thức thông thường trong Terminal? Nhưng nó ổn khi sử dụng sed. Sed hoạt động theo từng dòng, vì vậy không hỗ trợ \ n trong phần tìm kiếm (ngay cả phiên bản 'mới nhất' cũng không). Nhưng sed (ngoài một phiên bản cũ trên unxutils) không hỗ trợ nó trong phần thay thế, đó là những gì bạn cần. Perl tất nhiên hỗ trợ nó trong việc tìm hoặc thay thế.

Bạn có thể nhận được sed từ gnuwin32 http://gnuwin32.sourceforge.net/packages.html tải sed ở đó, và nếu làm điều đó thì tôi khuyên bạn cũng nên lấy gutwin32 coreutils, và bất cứ điều gì khác mà bạn thấy bạn muốn.

Có một phiên bản cũ của sed từ unxutils mặc dù tôi không đề xuất rằng và phiên bản cũ của sed mà unxutils có là GNU sed phiên bản 3.02 không hỗ trợ. Ngoài ra còn có một chiếc sed trên Windows SUA, nhưng cái đó cũng không hỗ trợ và thậm chí không nói đó là phiên bản nào.

Vì vậy, có được sed từ gnuwin32 hoặc cygwin hoặc MinGW hoặc gow. Không SUA và không unxutils.


0
sed 's/abstract_/abstract_\n/g' 9999999x.xml > 9999999xa.xml

sedlà một unixtrình soạn thảo kỳ lạ mà ít người từng sử dụng, ngoại trừ việc chỉnh sửa nội tuyến. Nó được cài đặt trong tất cả các bản phân phối.

Trong trường hợp này, nó lấy tệp đầu vào, và sau đó áp dụng lệnh giữa các dấu ngoặc kép, thông báo cho trình soạn thảo thay thế abstract_bằng abstract_\n. Các gyêu cầu sedđể đi và làm điều đó trên toàn bộ tập tin.

Nó gõ kết quả stdoutđược chuyển hướng đến đây 9999999xa.xml. Không chuyển hướng đến cùng một tệp với đầu vào, vì điều đó có thể gây ra kết quả không thể đoán trước.

Chỉnh sửa: Tất cả chúng ta đều nghiện trình chỉnh sửa màn hình, nơi văn bản được hiển thị và bạn di chuyển xung quanh và chỉnh sửa những gì bạn muốn.

sedlà khác nhau - bạn phải biết trước những lệnh nào bạn sẽ áp dụng cho tệp và ghi chúng vào tệp 'script' hoặc bao gồm các lệnh trên chính dòng lệnh. Sau đó sedsẽ áp dụng các lệnh đó theo cách dựa trên từng dòng (hầu hết) cho tệp đầu vào.

Tiêu đề 'trình soạn thảo nội tuyến' có thể kiếm được bởi thực tế là bạn có thể chèn sedmột dòng lệnh và sử dụng chuyển hướng để biến nó thành một phần của quy trình ... Một ví dụ (có thể được tối ưu hóa):

cat some.txt | sed 's/abstract_/abstract_\n/g' | sort

Vì vậy, văn bản chảy từ cat, thông qua sed, sortđược gọi là đường ống. sedđôi khi được gọi là trình chỉnh sửa luồng, vì lý do tương tự. Có một cái nhìn vào phần giới thiệu cho sedhướng dẫn của .


bạn cũng có thể đặt \0\ntrong phần thay thế. Người ta có thể sử dụng -i để thay thế tại chỗ. sed -i.bak "s/a/b/g" a.a hoặc mạo hiểm hơn một chútsed -i.bak "s/a/b/g" a.a
barlop 13/07/2015

Nhân tiện, "chỉnh sửa nội tuyến" nghĩa là gì?
barlop

Thêm một số ghi chú cho câu trả lời. Họ không vừa ở đây ...
jcoppens 13/07/2015

bạn lấy thuật ngữ từ đâu Có một giải thích ở đây về một cái gì đó tương tự eecs.qmul.ac.uk/~gc/history em là người đầu tiên thực hiện chỉnh sửa một dòng. tương tác trên một dòng duy nhất. Đó là một sự đổi mới từ việc không nhìn thấy tập tin khi chỉnh sửa. Mặc dù sed không phải là một trình soạn thảo dòng đơn. Nó lấy một tệp làm đầu vào và chạy một tập lệnh trên nó ảnh hưởng đến nhiều dòng.
barlop

Khi tôi bắt đầu lập trình - cách đây quá lâu - tôi đã sử dụng ed(hoặc là nó edlin?) Chúng tôi thực sự đã viết trình biên dịch với điều đó, lên tới 50k dòng trong một tệp. Tôi thấy sedtương tự - với sự khác biệt mà nó hoạt động trên các luồng (và không tương tác). Tôi đã thực sự nhận được ở in-lineđâu? Tôi không thể nhớ - có những bài viết thường xuyên đề cập đến nó như vậy. ( ví dụ )
jcoppens
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.