我有一个F5 bigip.conf文本文件,其中我想将显示" 10.166.201的所有行的路径域从701更改为703。"路由域由%701
表示10.166.201.10%701
10.166.201.15%701
10.166.201.117%701
我能用bash做到这一点,但问题是"否则printf"命令(我也试过回声),它应该打印出所有其他行,错误地解析像" \ r \ n"并将它们留作""
#!/bin/bash
while read line
do
if [[ $line = *"10.166.201"* ]];
then
printf '%s\n' "$line" | sed -e 's/701/703/'
else printf '%s\n' "$line"
fi
done < bigip.conf > bigip.conf_updated
有没有办法阻止printf和echo修改&#34; \ r \ n&#34;?
在sed / awk中有更好的方法吗?
感谢。
答案 0 :(得分:1)
sed '/10\.166\.201\./s/%701/%703/' bigip.conf
确定该命令后,您可以使用-i
更改文件:
sed -i'' '/10\.166\.201\./s/%701/%703/' bigip.conf
使用GNU sed,您可以省略-i
的选项值:
sed -i '/10\.166\.201\./s/%701/%703/' bigip.conf
答案 1 :(得分:1)
关注awk
可能对您有所帮助。
awk '{gsub(/\r/,"")} /your_string/{sub(/701/,"703")} 1' Input_file
如果您想将输出保存到相同的Input_file本身,请执行以下操作:
awk '{gsub(/\r/,"")} /your_string/{sub(/701/,"703")} 1' Input_file > temp_file && mv temp_file Input_file
编辑: 如果您的Input_file中包含\r
,那么我在上面的代码中添加了{gsub(/\r/,"")}
,以防您不拥有它们你可以从代码中删除它们。
EDIT2: 将字符串更改为your_string也会在您的地址中将.
更改为\.
。
答案 2 :(得分:1)
sed
:
sed -E 's/(10\.166\.201\.[[:digit:]]+%70)1/\13/'
捕获的群组(10\.166\.201\.[[:digit:]]+%70)
按字面匹配10.166.201.
,然后匹配一个或多个数字,然后%70
字面上
在捕获的群组之外,1
字面上匹配;在替换中,使用捕获的组,并将1替换为3
示例:强>
% cat file.txt
10.166.201.10%701
10.166.201.15%701
10.166.201.117%701
% sed -E 's/(10\.166\.201\.[[:digit:]]+%70)1/\13/' file.txt
10.166.201.10%703
10.166.201.15%703
10.166.201.117%703
答案 3 :(得分:1)
清晰,简单,强大,高效的方式是:
awk 'BEGIN{RS=ORS="\r\n"; FS=OFS="%"} index($1,"10.166.201.")==1{ $2="703" } 1' file
请注意,您不需要转义.
或锚点以避免部分匹配,因为上述内容只是将IP地址视为出现在行首的字符串。以上使用GNU awk进行多字符RS保存\r\n
行结尾。