Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash在文件中查找和替换是';不工作,我做错了什么?_Bash_Unix - Fatal编程技术网

Bash在文件中查找和替换是';不工作,我做错了什么?

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命令而不是所

我试图用前面定义为变量(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命令而不是所有管道命令:

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!