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

时间:2019-11-22 10:42:35

标签: linux bash awk sed

我有一个文件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参数之类的新行)来处理变量...但是如何解决呢?

1 个答案:

答案 0 :(得分:2)

由于多行替换和替换文本,因此与 editComponent: t => this.currentEditingTarget === 0 ? ( <Select value={t.value} onChange={e => { t.onChange(e.target.value); console.group(e.target.value); this.currentEditingTarget = e.target.value; }} > <MenuItem value={0}>{devices[0]}</MenuItem> <MenuItem value={1}>{devices[1]}</MenuItem> </Select> ) : ( <TextField value={t.value} onChange={e => t.onChange(e.target.value)} type="numeric" /> ), 相比,sed更容易实现。您可以使用以下awk

awk

此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 并设置标志test1 {
  • p=1期间继续读取文件而没有打印任何内容
  • 如果p==1并找到一个p==1行,然后使用变量}中传递的多行文本设置$0并重置var
  • 仅在p=0
  • 时打印行