繁体   English   中英

用包含多行包含特殊字符的变量替换块

[英]Replace block with variable containing multiple lines containing special characters

我有一个文件 out.txt

test1 {
       car "ok"
       disk "N/A"
       tire 4
}

我需要将整个块/test1 {/, /\}/替换为另一个应该在变量中的块(bash)

所以在脚本中它看起来像这样:

#!/bin/bash
var="
    test1 {
           car "fail"
           disk "2"
           tire 1
    }
"
sed -r --follow-symlinks -e "/^test1 /,/\}/c\\${text}" out.conf

哪一个当然不起作用,因为 sed 使用 { 处理变量以及像它的 sed 参数这样的新行......但是如何围绕它进行 go 呢?

由于多行替换和替换文本,使用awk而不是sed更容易做到这一点。 您可以使用此awk

var="
    test1 {
           car "fail"
           disk "2"
           tire 1
    }
"
awk -v var="$var" 'p && /^[[:blank:]]*}[[:blank:]]*$/ { $0=var; p=0 } 
/^[[:blank:]]*test1[[:blank:]]*\{/ { p=1 } !p' out.conf

这个 awk 的工作原理如下:

  • 在一行中搜索文本test1 {并设置标志p=1
  • p==1时继续读取文件而不打印任何内容
  • 如果p==1并找到带有}的行,则使用变量var中传递的多行文本设置$0并重置p=0
  • 仅当p==0时打印行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM