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