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