簡體   English   中英

bash腳本中的SED Escape

[英]SED Escape in bash script

我的tempfile.txt具有以下內容[Typical Cisco Configuration File]

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

我該如何逃避/正如我在循環中所做的那樣-我的界面將始終包含/字符

通過在其前面加上反斜杠來告訴sed在搜索中代替/的字符:

sed -n "\@${line}@,/!/p" ...

要處理文本塊,請使用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
!

bash ,可以使用參數全局替換運算符${varname//old/new} ,將斜杠替換為反斜杠,如下所示:

while read line; do
   sed -n "/${line//\//\/\/}/",'/!/p' tempfile.txt | # do stuff
done <interfaces.txt

...但是聖潔的牙簽,蝙蝠俠! 我會使用@JonathanLeffler的解決方案來更改sed的搜索分隔符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM