我需要删除以下示例文件格式的记录:
record {
record {
my_id_1
my_name_1
}
record {
my_id_2
my_name_2
}
record {
my_id_3
my_name_3
}
}
在这种情况下,我们需要使用唯一值my_id
或my_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
{
##########################
这也是我的PYTHON尝试
##########################
使用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`
谢谢
相信这就是你想要的,但它会给你留下一条空白。它只是将它们括起来作为段落,然后删除具有该记录名称的段落
您可能认为只需在sed语句中附加一个
; 1d
就可以删除它但是,这没有效果,第1行仍然为空。您可以通过管道将其传输到后续的
sed
命令来克服这一点,但这似乎是不可靠的。也许其他人知道原因https://www.gnu.org/software/sed/manual/sed.html
你可以试试:
上面修改了文件并创建了文件的备份,名为
file.conf.bak
。如果不需要原始文件的备份,可以从-i.bak
中删除.bak
这可能适用于您(GNU-sed):
使用您最初的方法,但使用贪婪进行额外的测试,如果成功,它将保留匹配字符串的前面。如果没有这样的匹配,则恢复并像以前一样删除整个匹配字符串
注意:这可能会引入一些不需要的填充物,将其移除作为读者的练习;-)
相关问题 更多 >
编程相关推荐