如果一条线符合某个条件,则sed将替换由图案范围匹配的线

2024-10-16 20:52:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要删除以下示例文件格式的记录:

record {
    record {
        my_id_1
        my_name_1
    }
    
    record {
        my_id_2
        my_name_2
    }
    
    record {
        my_id_3
        my_name_3
    }
}

在这种情况下,我们需要使用唯一值my_idmy_id_2删除所有记录数据,预期结果应该是:

record {
    record {
        my_id_1
        my_name_1
    }
    
    record {
        my_id_3
        my_name_3
    }
}

注意:该文件不是谈论空格、新行等的标准文件,但核心逻辑可能是删除单词record[包括同一单词]之间的所有内容,这些内容仅与括号中的my_id_*字符串相关

到目前为止,我所能做的就是写:

sed -n '/record/{:a;N;/}/!ba; /my_id_2/p}' file.conf

事实上,它找到了我需要的东西,但我无法删除它,我只是打印我想清除的行

sed是我的主要选项,但是python{}也可以,所以我可以将它传递给ansible

##########################

这也是我的PYTHON尝试

##########################

工具:https://pythex.org/

使用python,这是我得到的最接近的结果:

第一次尝试: (?=my_id_2)([^}]+)(?=\})

比赛结果如下:

    `my_id_2 my_name_2`

然后稍微修改一下: (?=record )([^}]+)(?=\})

比赛结果如下:

Match 1

    `1. record { record { my_id_1 my_name_1`

Match 2

    `1. record { my_id_2 my_name_2`

Match 3

`1. record { my_id_3 my_name_3`

谢谢


Tags: 文件数据nameid示例内容mymatch
3条回答

相信这就是你想要的,但它会给你留下一条空白。它只是将它们括起来作为段落,然后删除具有该记录名称的段落

sed '/./{H;$!d} ;x; /my_id_2/d' file.conf

您可能认为只需在sed语句中附加一个; 1d就可以删除它

sed '/./{H;$!d} ;x; /my_id_2/d ; 1d' file.conf

但是,这没有效果,第1行仍然为空。您可以通过管道将其传输到后续的sed命令来克服这一点,但这似乎是不可靠的。也许其他人知道原因

sed '/./{H;$!d} ;x; /my_id_2/d' file.conf | sed '1d'

https://www.gnu.org/software/sed/manual/sed.html

你可以试试:

$ sed -i.bak '/record/{:a;N;/}/!ba; /my_id_2/d}' file.conf
$ cat file.conf
record {
    record {
        my_id_1
        my_name_1
    }
    
    
    record {
        my_id_3
        my_name_3
    }
}

上面修改了文件并创建了文件的备份,名为file.conf.bak。如果不需要原始文件的备份,可以从-i.bak中删除.bak

这可能适用于您(GNU-sed):

sed -E '/record \{/{:a;N;/\}/!ba;/my_id_2/!b;s/(record \{.*)\1.*/\1/;t;d}' file

使用您最初的方法,但使用贪婪进行额外的测试,如果成功,它将保留匹配字符串的前面。如果没有这样的匹配,则恢复并像以前一样删除整个匹配字符串

注意:这可能会引入一些不需要的填充物,将其移除作为读者的练习;-)

相关问题 更多 >