如何编码sed以删除关键字后的多行,直到到达下一个空白行

时间:2018-09-28 12:22:59

标签: unix sed

有人可以建议我如何编码可用于更新文本文件的sed脚本,如下所示:

每次在文件中遇到包含字符串“ Header_one”的行: -删除紧跟在“ Header_one”行之后的行,直到遇到下一个空白行。 -但不要删除“ Header_one”行本身

例如,一个包含以下内容的文件:

Header_one
dkrjng
djsje

Header_two
cklrgjsj
djrhg

Header_one
drgbyj
efgjjm
cddess

Header_three
sdfvgg
ddddfy

将更改为:

Header_one

Header_two
cklrgjsj
djrhg

Header_one

Header_three
sdfvgg
ddddfy

对于任何指导或解决方案,我将不胜感激。 谢谢, 詹姆斯。

3 个答案:

答案 0 :(得分:1)

尝试下面的代码

-e

这里的想法是替换2行之间的内容,并用标题(即Header_one)替换。代码的第二-e部分确实删除了Header_one和空格之间的数据;而第一个Header_one部分将其替换为新的标头private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if (dataGridView.Columns[e.ColumnIndex].Name == "MyCheckBoxCellName" && dataGridView.Columns[e.ColumnIndex].Value) { // Disable your Timer refresher.Enabled = false; } }

InputFile和OutputFiles是简单的重定向。

您还可以查看:https://askubuntu.com/questions/637003/delete-lines-between-2-strings

希望这会有所帮助:)

答案 1 :(得分:0)

sed是一种流编辑器,尽管sed的一个流行版本提供了一个似乎可以使其编辑文件的选项,但我强烈建议不要使用它。也就是说,您可以使用以下命令产生所需的输出:

sed -e '/Header_one/i\
Header_one\
\
' -e '/Header_one/,/^$/d' input

请注意,如果您不需要保留空白行,它会更干净:

sed -e '/Header_one/p' -e '/Header_one/,/^$/d' input

也:awk '/Header_one/{printf "Header_one\n\n"; next } 1' RS= ORS='\n\n' input

答案 2 :(得分:0)

使用Perl

perl -ne ' {  print "Header_one\n" if /Header_one/ ; print if not /Header_one/../^$/ } '