Tôi có một tập tin với các nội dung sau:
<username><![CDATA[name]]></username>
<password><![CDATA[password]]></password>
<dbname><![CDATA[name]]></dbname>
và tôi cần tạo một tập lệnh thay đổi "tên" trong dòng đầu tiên thành "cái gì đó", "mật khẩu" trên dòng thứ hai thành "cái gì đó" và "tên" trong dòng thứ ba thành "cái gì đó khác biệt". Tôi không thể dựa vào thứ tự của những điều này xảy ra trong tệp, vì vậy tôi không thể thay thế lần xuất hiện đầu tiên của "tên" bằng "một cái gì đó" và lần xuất hiện thứ hai của "tên" bằng "một cái gì đó khác nhau". Tôi thực sự cần phải thực hiện tìm kiếm các chuỗi xung quanh để đảm bảo rằng tôi đang tìm và thay thế đúng.
Cho đến nay tôi đã thử lệnh này để tìm và thay thế lần xuất hiện "tên" đầu tiên:
sed -i "s/<username><![CDATA[name]]><\/username>/something/g" file.xml
tuy nhiên nó không hoạt động nên tôi nghĩ một số nhân vật này có thể cần phải trốn thoát, v.v.
Lý tưởng nhất, tôi rất thích có thể sử dụng regex để chỉ khớp hai lần xuất hiện của "tên người dùng" và chỉ thay thế "tên". Một cái gì đó như thế này nhưng với sed
:
<username>.+?(name).+?</username>
và thay thế nội dung trong ngoặc bằng "cái gì đó".
Điều này có thể không?