【问题标题】:Insert new lines before first occurrence of an option string - unix在第一次出现选项字符串之前插入新行 - unix
【发布时间】:2020-10-06 21:03:39
【问题描述】:

初始文件:

BEGIN SUBRECORD
         Name "New_value"
         Prompt "New_value"
         Default "$PROJDEF"
         ListValues "$PROJDEF\(9)Overwrite"
END SUBRECORD 
MetaBag "CMetaProperty"
............
................
.................
MetaBag "CMetaProperty"
.................
.............
............
MetaBag "CMetaProperty" 

预期输出:我想在字符串MetaBag "CMetaProperty" 第一次出现之前添加新行并且有:

BEGIN SUBRECORD
         Name "New_value"
         Prompt "New_value"
         Default "$PROJDEF"
         ListValues "$PROJDEF\(9)Overwrite"
END SUBRECORD
BEGIN SUBRECORD
         Name "Variable"
         Prompt "Variable"
         Default "$PROJDEF"
         ListValues "$PROJDEF\(9)Overwrite"
END SUBRECORD
MetaBag "CMetaProperty"
............
................
.................
MetaBag "CMetaProperty"
.................
.............
............
MetaBag "CMetaProperty"

我尝试使用 sed 命令,但在所有出现之前插入新行 我的选项字符串的 s。

sed  '/MetaBag "CMetaProperty"/ i       BEGIN SUBRECORD\n         Name "Variable"\n         Prompt "Variable"\n         Default "$PROJDEF"\n         ListValues "$PROJDEF\(9)Overwrite"\n      END SUBRECORD' infile.txt

如何修改命令?

【问题讨论】:

    标签: string unix sed insert


    【解决方案1】:

    试试

    awk '{if($0 ~ /MetaBag/ && $0 !~ /^MetaBag/) gsub( /MetaBag/ , "\n&", $0)}1'
    

    $0 ~ /MetaBag/ MetaBag
    $0 !~ /^MetaBag/ MetaBag
    @987654324 开头@

    演示:

    $cat test.tst
    BEGIN SUBRECORD
             Name "New_value"
             Prompt "New_value"
             Default "$PROJDEF"
             ListValues "$PROJDEF\(9)Overwrite"
    END SUBRECORD *MetaBag "CMetaProperty"*
    ............
    ................
    .................
    MetaBag "CMetaProperty"
    .................
    .............
    ............
    MetaBag "CMetaProperty" 
    
    $awk '{if($0 ~ /MetaBag/ && $0 !~ /^MetaBag/) gsub( /MetaBag/ , "\n&", $0)}1' test.tst
    BEGIN SUBRECORD
             Name "New_value"
             Prompt "New_value"
             Default "$PROJDEF"
             ListValues "$PROJDEF\(9)Overwrite"
    END SUBRECORD *
    MetaBag "CMetaProperty"*
    ............
    ................
    .................
    MetaBag "CMetaProperty"
    .................
    .............
    ............
    MetaBag "CMetaProperty" 
    
    $
    

    【讨论】:

      【解决方案2】:

      这可能对你有用(GNU sed 和 cat):

      <<\! sed -e '/MetaBag/{e cat -' -e ':a;n;ba}' file
      Lines of text to insert
          before the first occurrence 
          of the string `MetaBag`
      
      !
      

      在插入的字符串之后,sed 调用读取/打印文件的其余部分。

      要插入的字符串被放置在 here-document 中,并匹配正则表达式 /MetaBag/ sed 评估 cat - 它接受 here-document 作为标准输入,并在 @987654324 时将其作为标准输出直接传递@ 命令被执行。然后 sed 脚本运行一个循环,在模式空间中打印当前行并替换为下一行,然后重复到文件末尾。

      注意e 命令评估其后面的命令,这些命令必须以换行符(或其等效项)结尾。 -e 选项默认执行此操作,因此脚本分为两部分以适应此情况。

      【讨论】:

      • 乍一看是有效的。谢谢!你能解释一下命令吗?
      • 另外,如果我想用 MetaBag 作为参数,我应该如何修改它?
      • @MathewLinton 您可以将MetaBag 替换为'"$param"',但是参数中的任何元字符(例如^$.*&amp;[]/\ )都应该通过在它们前面放置一个` \ ` 来转义/引用。
      猜你喜欢
      • 2020-05-15
      • 2017-05-09
      • 1970-01-01
      • 2011-11-02
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      相关资源
      最近更新 更多