Regex 使用sed查找并替换?

Regex 使用sed查找并替换?,regex,linux,bash,sed,Regex,Linux,Bash,Sed,我正在尝试替换此命令: HOST_IP_ADDRESS=$(/sbin/ifconfig | grep inet | grep -v 127.0.0.1 | awk '{print $2}' | cut -d) 在我的多文件脚本文件中,只需一次尝试。我把输出放大了 grep -R 'HOST_IP_ADDRESS' ./ -R | grep "127.0.0.1" | awk -F ":" '{print $2}' 我想用HOST_IP_ADDRESS=hostname-I替换结果,而不

我正在尝试替换此命令:

HOST_IP_ADDRESS=$(/sbin/ifconfig  | grep inet | grep -v 127.0.0.1 | awk '{print $2}' | cut -d)
在我的多文件脚本文件中,只需一次尝试。我把输出放大了

 grep -R 'HOST_IP_ADDRESS' ./ -R | grep "127.0.0.1" | awk -F ":" '{print $2}'
我想用HOST_IP_ADDRESS=
hostname-I
替换结果,而不是

HOST_IP_ADDRESS=$(/sbin/ifconfig  | grep inet | grep -v 127.0.0.1 | awk '{print $2}' | cut -d

他们是否可以通过sed命令执行此操作。

为什么要使用sed?也许您可以使用此替代解决方案:

HOST_IP_ADDRESS=$(hostname -I | cut -f1 -d' ')

请参见

如果我理解您的意思,您希望替换此:

HOST_IP_ADDRESS=$(/sbin/ifconfig  | grep inet | grep -v 127.0.0.1 | awk '{print $2}' | cut -d)
作者:

这有点困难,因为需要转义的字符,请查看下面的脚本:

#! /bin/bash

o='HOST_IP_ADDRESS=$(/sbin/ifconfig  | grep inet | grep -v 127.0.0.1 | awk '\''{print $2}'\'' | cut -d)'
n='HOST_IP_ADDRESS=$(hostname -i)'

echo "$o" > file
sed -e 's#'"$o"'#'"$n"'#g' file
其产出:

bash  test.sh 
HOST_IP_ADDRESS=$(hostname -i)

cat file
HOST_IP_ADDRESS=$(/sbin/ifconfig  | grep inet | grep -v 127.0.0.1 | awk '{print $2}' | cut -d)

这都是关于如何转义的,正如您所看到的,这个脚本在
$o
中创建了一个包含旧字符串的文件,然后用新字符串
$n
替换,如果您想修改文件,请使用
-i.bak
而不是
-e
,以确保您进行备份这将在适当的位置编辑您的文件,将ifconfig hack替换为
$(hostname-i)

先做备份


实际上,它不仅会替换ifconfig hack,还会替换以
HOST\u IP\u ADDRESS=

开头的任何行,正如我在链接的问题中已经提到的,请注意,除了GNU的
hostname
实现之外,所有
hostname
提示/答案都很可能失败,与几乎所有其他Unix版本一样,此工具用于设置主机名,而不是查找有趣的内容。据我所知,这包括OSX、*BSD、Solaris,可能还有更多。因此,依赖这种行为将导致不可移植的代码。
bash  test.sh 
HOST_IP_ADDRESS=$(hostname -i)

cat file
HOST_IP_ADDRESS=$(/sbin/ifconfig  | grep inet | grep -v 127.0.0.1 | awk '{print $2}' | cut -d)
sed -i -e 's/\(HOST_IP_ADDRESS=\).*/\1$(hostname -i)/' filenames-go-here