我目前正在熟悉 Ubuntu。我有一个处理多个 bash 文件的个人项目。
config.txt
我有一个包含以下字符串的文件:
hostip="192.168.1.2"
pname="My Office"
pid="01-001"
hostip
我的问题是,如果我有一个需要文件中变量的 bash 文件config.txt
,如何提取192.168.1.2
字符串(应从输出中删除双引号)?
答案1
您可以使用它awk
来实现这一点,例如:
$ awk -F'"' '/hostip/ {print $2}' host.txt
192.168.1.2
- 该
-F
选项决定字段分隔符 /hostip/
确定搜索字符串- 并
{print $2}
确定要打印的字段
这样,您就可以从文件中获取该字符串并将其放入 bash 脚本内的变量中,例如:
hostip=$(awk -F'"' '/hostip/ {print $2}' host.txt)
答案2
使用sed
sed -n "s/hostip=\([^ ]*.*\)/\1/p" config.txt
但如果您的 config.txt 声明中包含空格,例如hostip = 192.168.1.2
,请使用:
sed -n "s/hostip *= *\([^ ]*.*\)/\1/p" config.txt
最后,为了让生活更轻松,创建一个函数或包装脚本:
get_value() {
sed -n "s/$1 *= *\([^ ]*.*\)/\1/p" $2
}
get_value hostip config.txt
# prints 192.168.1.2
get_value pname config.txt
# prints My Office
hostip=$(get_value hostip config.txt)
答案3
使用 Raku(以前称为 Perl6)
~$ raku -ne 'put $/ if m/ <?after hostip\= > \" <([\d**1..3 \.]**3 \d**1..3)> \" /;' config1.txt
192.168.1.2
命令-ne
行标志告诉 Raku 逐行检查输入。上面的代码使用正零宽度lookbehind断言,写为<?after … >
.正则表达式查找四组数字的匹配,每组数字的长度为 1 到 3 位,每组数字之间用句点分隔。该<( … )>
习惯用法告诉 Raku 删除每个外部匹配并将内部匹配加载到$/
返回的 match 变量中。
HTH。