我的tempfile.txt具有以下内容[典型的思科配置文件]
interface GigabitEthernet1/11
no ip address
shutdown
rmon collection stats 6010 owner monitor
!
interface GigabitEthernet1/12
no ip address
shutdown
rmon collection stats 6011 owner monitor
!
interface GigabitEthernet1/13
no ip address
shutdown
rmon collection stats 6012 owner monitor
!
interface GigabitEthernet1/14
no ip address
shutdown
rmon collection stats 6013 owner monitor
!
我正在尝试循环以对每个块执行某些操作 实施例
interface GigabitEthernet1/14 --> start of interface block
no ip address
shutdown
rmon collection stats 6013 owner monitor
! --> end of interface block
我有另一个文件,其中包含以下数据:intefaces.txt
interface GigabitEthernet1/11
interface GigabitEthernet1/12
interface GigabitEthernet1/13
interface GigabitEthernet1/14
现在想在每个块中做一些更改,这就是为什么我试图通过
访问块中的块while read line
do
sed -n '/$line/,/!/p' tempfile.txt # this should get me block
#code for doing some changes in block
done < interfaces.txt
现在,因为我的$ line将是interfaces.txt中的一行,例如:interface GigabitEthernet1/11
我怎样才能逃避/
,因为我正在循环播放我的界面将始终包含/ character
答案 0 :(得分:4)
告诉sed
在搜索中使用哪个字符代替/
,前缀为反斜杠:
sed -n "\@${line}@,/!/p" ...
答案 1 :(得分:2)
要处理文本块,请使用gnu awk
(由于RS中有多个字符)
awk -vRS="interface" '/1\/13/ {print RS $0}' file
interface GigabitEthernet1/13
no ip address
shutdown
rmon collection stats 6012 owner monitor
!
在这里,您可以获得接口1/13
您可以通过将/
变为变量来阻止awk -vRS="interface" -vtest="1/13" '$0~test {print RS $0}'
interface GigabitEthernet1/13
no ip address
shutdown
rmon collection stats 6012 owner monitor
!
的转义。
{{1}}
答案 2 :(得分:1)
在bash
中,您可以使用参数全局替换运算符${varname//old/new}
来替换带有反斜杠的斜杠,如下所示:
while read line; do
sed -n "/${line//\//\/\/}/",'/!/p' tempfile.txt | # do stuff
done <interfaces.txt
......但神圣的倾斜牙签,蝙蝠侠!我会选择@ JonathanLeffler改变sed搜索分隔符的解决方案。