我的文字如下:
TEXT="I need to replace the hostname [[google.com]] with it's ip in side the text"
有没有办法使用类似下面的东西,但有效吗?
sed -Ee "s/\[\[(.*)\]\]/`host -t A \1 | rev | cut -d " " -f1 | rev`/g" <<< $TEXT
看起来 \ 1 的值未被传递给sed中使用的shell命令。
由于
答案 0 :(得分:1)
反引号插值由 shell执行,不是由sed
执行。这意味着在运行sed命令之前,您的反引号将被命令的输出替换,或者(如果您正确引用它们)它们将不会被替换,并且sed
将看到反引号。 / p>
您似乎尝试让sed执行替换,然后让shell执行反引用插值。
你可以通过正确引用它们来获得反引用的反引号:
$ echo "" | sed -e 's/^/`hostname`/'
`hostname`
但是,在这种情况下,您将不得不在shell命令行中使用结果字符串来重新引用反引号。
根据您对awk,perl或python的看法,我建议您使用其中一个来完成这项工作。或者,您可以首先将主机名解压缩为没有反引号的命令,然后执行命令以获取所需的IP地址,然后在另一个传递中替换它们。
答案 1 :(得分:1)
它必须是一个两部分命令,一个用于获取bash可以使用的变量,另一个用sed进行直接/ s /替换。
TEXT="I need to replace the hostname [[google.com]] with it's ip in side the text"
DOMAIN=$(echo $TEXT | sed -e 's/^.*\[\[//' -e 's/\]\].*$//')
echo $TEXT | sed -e 's/\[\[.*\]\]/'$(host -tA $DOMAIN | rev | cut -d " " -f1 | rev)'/'
但是,更清洁地使用how to split a string in shell and get the last field
TEXT="I need to replace the hostname [[google.com]] with it's ip in side the text"
DOMAIN=$(echo $TEXT | sed -e 's/^.*\[\[//' -e 's/\]\].*$//')
HOSTLOOKUP=$(host -tA $DOMAIN)
echo $TEXT | sed -e 's/\[\[.*\]\]/'${HOSTLOOKUP##* }/
简短版本是你不能按照你期望的方式混合sed和bash。
答案 2 :(得分:0)
这有效:
#!/bin/bash
txt="I need to replace the hostname [[google.com]] with it's ip in side the text"
host_name=$(sed -E 's/^[^[]*\[\[//; s/^(.*)\]\].*$/\1/' <<<"$txt")
ip_addr=$(host -tA "$host_name" | sed -E 's/.* ([0-9.]*)$/\1/')
echo "$txt" | sed -E 's/\[\[.*\]\]/'"$ip_addr/"
# I need to replace the hostname 172.217.4.174 with it's ip in side the text
答案 3 :(得分:0)
谢谢大家,
我做了以下解决方案:
function host_to_ip () {
echo $(host -t A $1 | head -n 1 | rev | cut -d" " -f1 | rev)
}
function resolve_hosts () {
local host_placeholders=$(grep -o -e "##.*##" $1)
for HOST in ${host_placeholders[@]}
do
sed -i -e "s/$HOST/$(host_to_ip $(sed -Ee 's/##(.*)##/\1/g' <<< $HOST))/g" $1
done
}
其中resolve_hosts将文本文件作为参数