Điểm:4

Sử dụng sed với một biến bên trong dấu ngoặc kép

lá cờ kr

tôi có một tập tin đầu vào.xml trong đó có một dòng: <exciton lambda="1" fix="hole"/>

trong dòng đó tôi muốn thay thế 1 bằng 2 nhưng tôi không thể sử dụng chỉ 1 làm từ khóa vì có các trường hợp khác của "1" trong cùng một tệp nên tôi phải sử dụng từ khóa lambda="1"

Tôi đang cố gắng sử dụng lệnh sed như sau:

sed -i "s/lambda="1"/lambda="$value"/g" input.xml

Nhưng nó không hoạt động, bất cứ ai có thể xin vui lòng giúp đỡ.

Điểm:5
lá cờ cn

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

Điểm:2
lá cờ tj

Tôi đang cố gắng sử dụng lệnh sed như sau:

sed -i "s/lambda="1"/lambda="$value"/g" input.xml

Giả định giá trị đã được xác định, kèm theo biến với dấu nháy đơn: 'giá trị $':

sed -i 's/lambda="1"/lambda="'$value'"/g' input.xml

CHỈNH SỬA như @terdon đã chỉ ra, nếu bạn giá trị biến chứa khoảng trắng ở trên sẽ không hoạt động và bạn sẽ cần trích dẫn hai lần biến trong dấu ngoặc đơn:

sed -i 's/lambda="1"/lambda="'"giá trị $"'"/g' input.xml

terdon avatar
lá cờ cn
Điều này sẽ thất bại nếu `$value` chứa khoảng trắng.Điều này là do bạn không thực sự đặt `$value` trong dấu nháy đơn ở đây. Rốt cuộc, các biến được đặt trong dấu ngoặc đơn không được mở rộng. Các trích dẫn chỉ cần kết thúc biểu thức `sed` được trích dẫn đơn và bắt đầu một biểu thức mới. Để đảm bảo điều này an toàn, bạn cần: `sed -i 's/lambda="1"/lambda="'"$value"'"/g' input.xml`.
fuzzy drawings avatar
lá cờ tj
OP đã chỉ ra rằng `giá trị` sẽ là **2** (một số nguyên khác), nhưng vâng, nó sẽ không thành công nếu thay vào đó anh ta sử dụng một giá trị chứa khoảng trắng hoặc kết thúc dòng. Tôi đoán rằng tôi cần tập thói quen luôn sử dụng các biến được trích dẫn kép.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.