bash脚本中的SED转义

bash脚本中的SED转义,bash,sed,Bash,Sed,My tempfile.txt包含以下内容[典型Cisco配置文件] 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 Gigabit

My tempfile.txt包含以下内容[典型Cisco配置文件]

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
!
我试着在每个块上循环执行一些操作 范例

我有另一个文件,其中包含以下数据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 
读取行时
做
sed-n'/$line/,//p'tempfile.txt#这应该可以阻止我
#用于在块中进行某些更改的代码
完成
现在,由于我的$line将是interfaces.txt的其中一行,例如:
interface GigabitEthernet1/11


如何在循环中转义
/
&我的界面将始终包含/character

要处理文本块,请使用
gnu awk
(由于RS中有多个字符)

在这里您可以获得界面
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
读行时
;做
sed-n“/${line/\/\/\/\/}/”,“//p'tempfile.txt |#做事

已完成在搜索中用反斜杠作为前缀,告诉
sed
使用哪个字符代替
/

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

sed-e's,/,\\/,'
?你能详细介绍一下你喜欢做什么吗。是否要使用另一个文件中的数据更新配置文件?Cisco Works应该能做到这一切,但这不是一个简单的解决方案。@Jotne:我正在解析它以生成XML,并将其用于XML的一些API。每当你编写一个shell循环只是为了处理文本时,你的方法就错了。就用awk吧,它是由发明外壳的人发明的。第二个文件的意义是什么?是否将要执行的操作仅限于某些接口?如果它只是一个所有文件的列表,那么它就没有用处。@MarkReed可以根据需要从另一个文件中读取它。Se也是一个使用
/
而不在
awk
中转义的解决方法,谢谢-我不知道awk的
~
操作符会用字符串代替正则表达式。有用的提示。谢谢,即使这样也有帮助。您应该提到,这只适用于GNU awk中的多字符RS。其他awk将使用
i
表示上述给定的RS值(一旦在
-v
RS
之间添加空格,则没有空格是特定于gawk的)@MarkReed并不是说
~
用字符串代替regexp,而是说
~
可以在指定为regexp文本
/re/
或动态regexp
“re”
的regexp上工作。它们都是正则表达式,但后者需要对元字符等进行双重转义(如果合适),并且可以与其他字符串/变量连接以形成更大的动态正则表达式。有关详细信息,请参阅。
-bash:/p“:未找到事件
如何消除此错误偏见的方式是说“从
bash
中清除
csh
垃圾”,但这并不完全是小事。将
用单引号而不是双引号括起来:
sed-n“\@${line},"'/!/是的!我意识到了。ThanksBang的扩展非常有用,所以我还是不放弃它为好。但它遵循自己独特的雪花引用规则的方式显然是荒谬的。
while read line; do
   sed -n "/${line//\//\/\/}/",'/!/p' tempfile.txt | # do stuff
done <interfaces.txt
sed -n "\@${line}@,/!/p" ...