【问题标题】:sed script to remove everything in brackets over multiple linessed 脚本删除多行括号中的所有内容
【发布时间】:2017-07-11 03:30:27
【问题描述】:

我正在尝试使用 sed 脚本来删除文件中数组的内容。我试图删除内容只留下括号()。但是我无法让 sed 脚本在多行上工作。

我正在尝试更改文件的当前状态:

LIST = ( "content"
         "content1"
         "content3")

对此:

LIST = ()

但是我使用的 sed 脚本只将文件更改为:

LIST = ()
     "content"
     "content1"
     "content2"

sed -e 's/LIST=\([^)]*\)/LIST=() /g' filename

我还应该提到我不想影响文件中的其他括号集。

例如

LISTNUMBER2("CONTENT")  

不应清空。

【问题讨论】:

    标签: sed


    【解决方案1】:

    这个 sed 单行代码适用于您的示例:

    sed -n '1!H;1h;${x;s/(.*)/()/;p}'
    

    测试:

    kent$  echo 'LIST = ( "content"
             "content1"
             "content3")'|sed -n '1!H;1h;${x;s/(.*)/()/;p}'
    LIST = ()
    

    如果您可以使用 awk,则此单行代码也适用于您的示例:

    awk -v RS="" '{sub(/\(.*\)/,"()")}1' 
    

    测试:

    kent$  echo 'LIST = ( "content"
             "content1"
             "content3")'|awk -v RS="" '{sub(/\(.*\)/,"()")}1'                                                                                                                  
    LIST = ()
    

    编辑 OP 的评论

    多括号情况:

    awk

     awk -v RS="\0" -v ORS="" '{gsub(/LIST\s*=\s*\([^)]*\)/,"LIST = ()")}1' file
    

    测试:

    kent$  cat file
    LISTKEEP2("CONTENT")  
    LIST = ( "content"
             "content1"
             "content3")
    LISTNUMBER2("CONTENT")  
    
    kent$  awk -v RS="\0" -v ORS="" '{gsub(/LIST\s*=\s*\([^)]*\)/,"LIST = ()")}1' file
    LISTKEEP2("CONTENT")  
    LIST = ()
    LISTNUMBER2("CONTENT") 
    

    sed

     sed -nr '1!H;1h;${x;s/(LIST\s*=\s*\()[^)]*\)/\1)/;p}' file
    
    kent$  sed -nr '1!H;1h;${x;s/(LIST\s*=\s*\()[^)]*\)/\1)/;p}' file
    LISTKEEP2("CONTENT")  
    LIST = ()
    LISTNUMBER2("CONTENT")
    

    【讨论】:

    • 感谢您的所有建议!我应该解释一下文件中的其他括号应该保持不变。我已经编辑了上面的问题!
    • @Sarah92 请参阅答案中的编辑
    【解决方案2】:

    另一种 sed 解决方案:

    sed '/LIST = (/{:next;/)/{s/(.*)/()/;b;};N;b next;}'
    

    这是一个不会更改任何包含特定字符串的块的版本(在本例中为“keepme”,但可以是任何内容):

    sed '/LIST = (/{:next;/)/{/keepme/b;s/(.*)/()/;b;};N;b next;}'
    

    由于这会在 之后进行 keepme 测试,因此它会发现右括号表明标签可以位于块中的任何位置。

    【讨论】:

    • 感谢您的所有建议!我应该解释一下文件中的其他括号应该保持不变。我已经编辑了上面的问题!
    • 我的脚本只作用于以LIST = ( 开头的块,其他的都不管了。您可以更改该模式,或在 /)/ 模式之后插入额外的测试,以便在需要时使其更具限制性。它不会处理嵌套括号 (())。 (如果您需要,我会推荐像 Perl 和 Text::Balanced 这样的解决方案。)
    猜你喜欢
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 2016-11-14
    • 2021-12-12
    • 2011-09-21
    • 2022-10-19
    • 1970-01-01
    • 2022-10-24
    相关资源
    最近更新 更多