使用sed删除所有不匹配模式的行

时间:2018-10-24 14:45:35

标签: linux bash sed

非常新(意思是一天)。我已经找到一种方法,可以使用查找/替换单个命令来删除不需要更新文件的行

我从一个强制性配置中获得了一个对象列表,如下所示:

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

我试图拥有它,当一切都说完之后,我试图保留三行(item4&item5)并删除所有其他行。另外,如果可能,请保留第一行和最后一行。

3 个答案:

答案 0 :(得分:1)

您的描述缺乏很多精确性,但是某事

sed -n -e '/^config/p;/item[45]/p;/^end/p' forti
config firewall address
edit "item4"
edit "item5"
end

编辑:此答案是在需要保留nextitem4之后直到item5的行的编辑之前2小时给出的...

答案 1 :(得分:1)

这可能对您有用(GNU sed):

sed '/config/,/end/!d;/config/b;/end/b;/item4/,+2b;/item5/,+2b;d' file

删除不在configend之间的所有行。打印以configend开头的行以及以item4item5开头的行以及以下两行。

答案 2 :(得分:0)

这可能不是最好的方法,但我找不到其他解决方法。

我将其范围缩小为四个命令,您可以将其放入bash脚本中(用自己的源文件替换file.txt,并用所需的任何目标替换/tmp/finalFile):

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

运行上述命令时,这是/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