Linux 使用sed删除所有不带';不符合模式
对sed来说是非常新的(意思是一天)。我用find/replace命令删除了更新文件不需要的行 我有一个fortigate配置中的对象列表,如下所示:Linux 使用sed删除所有不带';不符合模式,linux,bash,sed,Linux,Bash,Sed,对sed来说是非常新的(意思是一天)。我用find/replace命令删除了更新文件不需要的行 我有一个fortigate配置中的对象列表,如下所示: config firewall address <--keep line edit "item1" next edit "item2" next edit "item3" next edit "item4" <--keep line unset associated-interface <--keep line and use
config firewall address <--keep line
edit "item1"
next
edit "item2"
next
edit "item3"
next
edit "item4" <--keep line
unset associated-interface <--keep line and use as anchor for one line above and below
next <--keep line
edit "item5" <--keep line
unset associated-interface <--keep line and use as anchor for one line above and below
next <--keep line
edit "item6"
next
end <--keep line
config firewall address您的描述不够精确,但这里有一些东西:
编辑:此答案是在编辑前2小时给出的,该编辑要求保留项目4
和项目5
之后的下一个
这可能不是最好的方法,但我找不到其他解决方法
我将其缩减为四个命令,您可以将它们放入bash脚本中(用您自己的源文件替换file.txt
,用您需要的任何目标替换/tmp/finalFile
):
当我运行上述命令时,这是/tmp/finalFile
中的最后一个文件:
config firewall address
edit "item4"
unset associated-interface
next
edit "item5"
unset associated-interface
next
end
一些解释:
- 第一行是由
head
抓住的顶行,附加到finalFile
- 第二步基本上是查找到
item5
的每一行,并将其保存在临时文件中
- 第三步抓取该临时文件,并计算它需要多少行
tail
,以获得所有到item6
(不包括它)的行,并抓取这些行,将输出附加到finalFile
- 最后,最后一行用
tail
从原始文件中获取最后一行,并将其附加到finalFile
这可能适合您(GNU-sed):
删除不在config
和end
之间的所有行。打印以config
或end
开头的行和以item4
或item5
开头的行以及以下两行。预期输出是什么?到目前为止,你所发现的方法怎么没有达到你所期望的效果?你是否有理由避免使用head
、tail
和grep-v
?它会留下第一行和最后一行以及第4项和第5项没有理由的Shloim,缺乏知识。但是如果你有任何想法那就太好了!如果你能清楚地识别出你想保留哪一行,这会有所帮助——也许可以把放在sed-n'//p'
不是列表中的第一个答案,我感到很惊讶……不确定@eurythmia?是什么意思:)德普。。。我倒着读《泰晤士报》。。。这是第一个答案。。。我只是希望在顶部看到它,因为。。。嗯,这正是sed-n
用于输入的确切用例:-PThanks,但输出需要太多行,文件才能正常运行。mjurez,感谢输入,这确实有效,但您如何使用它并使用“关联接口”作为锚定,以保持行的上下。其他一切都按预期进行。他不知道“头”工具,也将对此进行调查。
head -n1 file.txt >> /tmp/finalFile
head -n $(echo $(grep -ni item6 file.txt | cut -d: -f1) - 1 | bc) file.txt > /tmp/tmpfile
tail -n $(echo $(wc -l /tmp/tmpfile | awk '{print $1}') - $(grep -n item4 /tmp/tmpfile | cut -d: -f1) + 1 | bc) /tmp/tmpfile >> /tmp/finalFile
tail -n1 file.txt >> /tmp/finalFile
config firewall address
edit "item4"
unset associated-interface
next
edit "item5"
unset associated-interface
next
end
sed '/config/,/end/!d;/config/b;/end/b;/item4/,+2b;/item5/,+2b;d' file