Thay thế văn bản với sed và giữ một phần của văn bản gốc


20

Tôi đang cố gắng chuyển đổi

<id>1</id>
<Name>ENTERPRISE RESOURCE PLANNING</Name>

đến:

<column name="id">1</column>
<column name="Name">ENTERPRISE RESOURCE PLANNING</column>

Tôi giả sử công cụ tốt nhất cho công việc sẽ là sed, tuy nhiên tôi không thể tìm ra cách giữ các phần của văn bản gốc trong phần thay thế.

Nếu tôi làm:

$ sed -i 's/<.*>.*<.*>/<column name="\\1">\\2<\/column>/g' filename.xml

Đầu ra là:

<column name="\1">\2</column>
<column name="\1">\2</column>

Hoặc làm tương tự từ bên trong vi, nó xuất ra:

<column name=""></column>
<column name=""></column>

Làm thế nào tôi có thể làm cho nó sao cho \1\2được thay thế trở lại giá trị ban đầu của chúng?

Câu trả lời:


21

Bạn có thể sử dụng các nhóm, ví dụ:

$ sed -i 's/<\(.*\)>\(.*\)<.*>/<column name="\1">\2<\/column>/g' filename.xml

Có lẽ phần khó hiểu nhất về REs là có nhiều hương vị cú pháp khác nhau.

Ví dụ: sed và vim sử dụng các biểu thức chính quy cơ bản nơi bạn phải trích dẫn ()để có ý nghĩa meta của chúng.

Với các biểu thức chính quy mở rộng (ví dụ awk, egrep và ít hơn), bạn phải trích dẫn ()để có nghĩa đen. Có sự khác biệt tương tự cho các siêu nhân vật khác.

Lý do đằng sau ()ngữ nghĩa BRE là khi hầu hết đầu vào của bạn là C-Code thì sẽ thực tế hơn khi phải trích dẫn dấu ngoặc đơn để sử dụng meta.


Đây thực sự là điều đầu tiên tôi thử, nhưng tôi đã không thoát khỏi (và các )nhân vật. Câu hỏi ngu ngốc, nhưng tại sao điều đó là cần thiết?
Mike

1
@Mike, câu hỏi hay - cập nhật câu trả lời.
maxschlepzig
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.