正则表达式匹配文件中的第一次出现

时间:2017-06-09 14:54:18

标签: regex sed

我正在尝试将新对象插入feLinks数组,因此我尝试将关闭数组标记];作为目标,这样我就可以将对象附加到数组中。

我正在尝试匹配第一次出现的];,因此我可以注入一个新对象

我确实知道懒惰的量词,但却无法使其发挥作用。

var fedLinks = [{
    Name:" Test",
    data:'value',
    tag:"first"
}];

var fedSet = [
{
    Name:"Dashboard",
    data:fedLinks
}];

这是我试过的

];.+? 

但它没有返回匹配

2 个答案:

答案 0 :(得分:1)

解决方案1:

$ sed -nr ':start;/\];/!{p;n;bstart};SUBSTITUTE;:end;p;n;bend'

说明:

  1. :start;/\];/!{p;n;bstart}:使用循环打印与包含\];的第一行匹配的内容。
  2. 使用SUBSTITUTE将新对象插入第一个数组。
  3. :end;p;n;bend:使用新的loop打印第一个];之后的行。
  4. 在此,我将s命令用于substitute null char}之间的] object使用您的新s/(})(])/\1,{\n name: "test2",\n data: "value2",\n tag: "second"\n}\2/

    $ cat test.txt 
    var fedLinks = [{
        name: "test1",
        data: "value1",
        tag: "first"
    }];
    
    var fedSet = [
    {
        name: "Dashboard",
        data: fedLinks
    }];
    

    例如:

    object

    我们要将另一个fedLinks添加到$ sed -nr ':start;/\];/!{p;n;bstart};s/(\})(\])/\1,{\n name: "test2",\n data: "value2",\n tag: "second"\n}\2/;:end;p;n;bend' test.txt var fedLinks = [{ name: "test1", data: "value1", tag: "first" },{ name: "test2", data: "value2", tag: "second" }]; var fedSet = [ { name: "Dashboard", data: fedLinks }]; 数组:

    first }];

    解决方案2:

    我们可以改变思考如何实现功能的方式。我们可以找到complete feLinks array block,而不是找到insert,然后进行$ sed -r '/fedLinks.*\[\{/!bend;:loop;N;/\}\]/{SUBSTITUTE;bend};bloop;:end' 操作。

    fedLinks.*\[\{

    说明:

    1. array:找到要插入新对象的end的开头;或者只是跳转到标签:loop以从流中读取下一行。
    2. loop:设置标签remaining以阅读属于fedLinks数组的N;...;bloop行。
    3. \n:将pattern space和流的下一行追加到与\}\]匹配的fedLinks util,这意味着/\}\]/{SUBSTITUTE;bend};bloop数组的结束。
    4. fedLinks:在获取属于fedLinks数组的所有行时处理end数组,然后跳转到标签$ sed -r '/fedLinks.*\[\{/!bend;:loop;N;/\}\]/{s/(})(])/\1,{\n name: "test2",\n data: "value2",\n tag: "second"\n}\2/;bend};bloop;:end' test.txt var fedLinks = [{ name: "test1", data: "value1", tag: "first" },{ name: "test2", data: "value2", tag: "second" }]; var fedSet = [ { name: "Dashboard", data: fedLinks }];
    5. 例如:

      let dd = getCharacteristic.value!;
      
      print(String(data: dd, encoding: String.Encoding.ascii)!);
      

答案 1 :(得分:1)

将awk与文字字符串一起使用,以获得健壮性,可移植性和清晰度(使用sed解决方案时无法使用这些字符串):

awk '
    NR==FNR{ add=(NR>1 ? add ORS : "") $0; next }
    s=index($0,"];") { $0=substr($0,1,s-1) add substr($0,s); add="" }
1' add.txt test.txt

上面从文件“add.txt”中读取新记录作为文字字符串,然后在文字字符串“]之前插入;出现在“test.txt”中并再次打印结果作为文字字符串。这样您就不必担心转义字符或正则表达式元字符或反向引用或任何输入文件中的任何其他内容 - 所有内容都将在您键入时完全重现。它也可以在任何UNIX机器上与任何awk一样工作。

例如(借用@ Weike的样本添加文字):

$ cat test.txt
var fedLinks = [{
    name: "test1",
    data: "value1",
    tag: "first"
}];

var fedSet = [
{
    name: "Dashboard",
    data: fedLinks
}];

$ cat add.txt
,{
    name: "test2",
    data: "value2",
    tag: "second"
}

$ awk 'NR==FNR{add=(NR>1 ? add ORS : "") $0; next} s=index($0,"];"){$0=substr($0,1,s-1) add substr($0,s); add=""} 1' add.txt test.txt
var fedLinks = [{
    name: "test1",
    data: "value1",
    tag: "first"
},{
    name: "test2",
    data: "value2",
    tag: "second"
}];

var fedSet = [
{
    name: "Dashboard",
    data: fedLinks
}];