SED Escape in bash脚本

时间:2014-12-09 18:29:33

标签: bash sed

我的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

3 个答案:

答案 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搜索分隔符的解决方案。