Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用sed删除所有不带';不符合模式_Linux_Bash_Sed - Fatal编程技术网

Linux 使用sed删除所有不带';不符合模式

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

对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 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