Trước hết, đó là không bao giờ là một ý tưởng tốt để cố phân tích cú pháp XML hoặc văn bản có cấu trúc khác bằng các biểu thức thông thường. Mặc dù về mặt lý thuyết có thể thực hiện tốt và an toàn, nhưng cực kỳ khó ngay cả đối với các chuyên gia. Tốt hơn hết là sử dụng một công cụ chuyên dụng được thiết kế để xử lý ngôn ngữ mà bạn có. Vì vậy, nếu đây là một tệp XML, bạn có thể sử dụng một cái gì đó như xmlstarlet
thay thế. Ví dụ: với tệp đầu vào này:
$ mèo tệp.xml
<?xml version="1.0"?>
<bản ghi id="1">
<exciton lambda="1" fix="hole"/>
</bản ghi>
Bạn có thể làm:
giá trị $="1234"
$ xml ed -u "//record[@id=1]/exciton/@lambda" -v "$value" file.xml
<?xml version="1.0"?>
<bản ghi id="1">
<exciton lambda="1234" fix="hole"/>
</bản ghi>
Tất cả những gì đã nói, với thông tin rất tối thiểu mà bạn đã cung cấp cho chúng tôi, có thể bạn có thể làm điều đó bằng cách sử dụng trình phân tích cú pháp đơn giản, ngây thơ như sed
. Có nhiều thủ thuật khác nhau mà bạn có thể thử. Đầu tiên, chỉ cần thoát khỏi dấu ngoặc kép:
$ sed "s/lambda=\"1\"/lambda=\"$value\"/" file.xml
<?xml version="1.0"?>
<bản ghi id="1">
<exciton lambda="1234" fix="hole"/>
</bản ghi>
Hoặc, sử dụng dấu nháy đơn nhưng kết thúc chúng và chèn biến được trích dẫn bên ngoài dấu nháy đơn. Sau đó, mở một dấu nháy đơn mới để tiếp tục sed
sự biểu lộ:
$ sed 's/lambda="1"/lambda="'"$value"'"/' file.xml
<?xml version="1.0"?>
<bản ghi id="1">
<exciton lambda="1234" fix="hole"/>
</bản ghi>
Cái đó hơi khó phân tích trực quan, nhưng đây là những gì nó đang làm với khoảng trắng được thêm vào để dễ đọc (lưu ý rằng nó không thực sự hoạt động với khoảng trắng được thêm vào, điều này chỉ để làm rõ):
sed 's/lambda="1"/lambda="' "$value" '"/' file.xml
Bạn có hai lựa chọn. Đầu tiên, bạn có thể thoát khỏi cú đúp