Bash在文件中查找和替换是';不工作,我做错了什么?
我试图用前面定义为变量(n)的不同IP替换文件(“/etc/hosts”)中的所有IP地址(127.0.0.1除外)。以下是我所拥有的:Bash在文件中查找和替换是';不工作,我做错了什么?,bash,unix,Bash,Unix,我试图用前面定义为变量(n)的不同IP替换文件(“/etc/hosts”)中的所有IP地址(127.0.0.1除外)。以下是我所拥有的: grep -v '127.0.0.1' /etc/hosts | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | xargs -0 sed -i '$n' 如果有帮助,变量的默认赋值为192.168.2.62 我是个新手,所以不管你有什么见解都会很棒,谢谢 您可以使用此awk命令而不是所
grep -v '127.0.0.1' /etc/hosts | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | xargs -0 sed -i '$n'
如果有帮助,变量的默认赋值为192.168.2.62
我是个新手,所以不管你有什么见解都会很棒,谢谢 您可以使用此awk命令而不是所有管道命令:
awk -v n="$n" 'NF>1 && $1 != "127.0.0.1" && $1 ~ /^\d{1,3}\./ {$1=n} 1' /etc/hosts
您可以使用此awk命令代替所有管道命令:
awk -v n="$n" 'NF>1 && $1 != "127.0.0.1" && $1 ~ /^\d{1,3}\./ {$1=n} 1' /etc/hosts
您可以使用单个
sed
命令:
sed -r '/127.0.0.1/!{s/([0-9]{1,3}\.){3}[0-9]{1,3}/'"$n"'/}' file.txt
说明:
/127.0.0.1/Regex模式
! 如果
前一个正则表达式不匹配
{块的开始
s启动'substitute'命令
/([0-9]{1,3}\){3}[0-9]{1,3}/Regex模式来匹配ip
(简体!)
/“$n”/替换IP。插值$n
}街区尽头
如果您确定命令按预期工作,请添加
-i
选项。使用-i
选项sed
将修改原始文件(file.txt)您可以使用单个sed
命令:
sed -r '/127.0.0.1/!{s/([0-9]{1,3}\.){3}[0-9]{1,3}/'"$n"'/}' file.txt
说明:
/127.0.0.1/Regex模式
! 如果
前一个正则表达式不匹配
{块的开始
s启动'substitute'命令
/([0-9]{1,3}\){3}[0-9]{1,3}/Regex模式来匹配ip
(简体!)
/“$n”/替换IP。插值$n
}街区尽头
如果您确定命令按预期工作,请添加
-i
选项。使用-i
选项sed
将修改原始文件(file.txt)您可以尝试下面的Perl one liner
$ n="192.168.2.62"
$ echo '192.1.1.6 127.0.0.1 173.75.3.5' | perl -pe 's/\b(?!127\.0\.0\.1)[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\b/'"$n/g"
192.168.2.62 127.0.0.1 192.168.2.62
添加内联编辑
-i
参数以保存所做的更改。您可以尝试下面的Perl one liner
$ n="192.168.2.62"
$ echo '192.1.1.6 127.0.0.1 173.75.3.5' | perl -pe 's/\b(?!127\.0\.0\.1)[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\b/'"$n/g"
192.168.2.62 127.0.0.1 192.168.2.62
添加内联编辑
-i
参数以保存所做的更改。这在OSX上对我有效:
find /etc/hosts -type f -exec sed -i '' '/^127\.0\.0\.1/! s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/192.192.192.192/g' {} \;
对于Linux,以下各项应该可以工作:
find /etc/hosts -type f -exec sed -i '/^127\.0\.0\.1/! s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/192.192.192.192/g' {} \;
不确定在Linux中使用大括号之前是否需要额外的斜杠
/^127.0.0.1/代码>=仅在不以127.0.0.1开头的行上进行替换这在OSX上对我有效:
find /etc/hosts -type f -exec sed -i '' '/^127\.0\.0\.1/! s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/192.192.192.192/g' {} \;
对于Linux,以下各项应该可以工作:
find /etc/hosts -type f -exec sed -i '/^127\.0\.0\.1/! s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/192.192.192.192/g' {} \;
不确定在Linux中使用大括号之前是否需要额外的斜杠
/^127.0.0.1/
=仅在不以127.0.0.1开头的行上进行替换将丢弃整行,而不是特定字符串。grep-v
将丢弃整行,而不是特定字符串。这适用于整行。也就是说,它将丢弃所有包含127.0.0.1
的行,如果文件包含类似192.1.1.6 127.0.0.1 173.75.3.5的行会怎么样?通常这是一个很好的观点!但是,/etc/hosts
文件每行不包含多个IP。。(可能除了在评论中)那太好了!谢谢你,hek2mgl!这适用于整个生产线。也就是说,它将丢弃所有包含127.0.0.1
的行,如果文件包含类似192.1.1.6 127.0.0.1 173.75.3.5的行会怎么样?通常这是一个很好的观点!但是,/etc/hosts
文件每行不包含多个IP。。(可能除了在评论中)那太好了!谢谢你,hek2mgl!