sed / awk在字符串中查找模式并在同一行上更改另一个模式

时间:2018-02-24 10:32:24

标签: bash awk sed

我有一个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中有更好的方法吗?

感谢。

4 个答案:

答案 0 :(得分:1)

使用regexp address

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行结尾。