为变量分配文件中字符串的值

时间:2013-08-30 14:28:39

标签: shell sed awk

我有一个名为 info.log 的文件,其中包含以下行:

/home/jax/Main_X_1_A

X 1 A 是有意义的,可以更改。但是“Main”和下划线保持不变。 是否可以使用实用程序根据 info.log 中的信息为shell变量分配值?

E.g。

MY_VERSION="?_?_?"; 

问号代表在这些位置找到的单个字符。 例如,如果 info.log 包含以下行:

/home/jax/Main_1_2_3

我们使用该数据初始化shell变量:

MY_VERSION=...
echo $MY_VERSION

输出结果为:

  

1_2_3

使用更好的示例更新问题:

info.log建立

MODULE=TEST
QUICK_BUILD_DIR=/usr/apps/Main_1_2_3
ANT_FILE=build.xml
FANCE=/usr/apps/test/Main_1_2_3

我希望能够取这三个数字(1,2和3):

QUICK_BUILD_DIR=/usr/apps/Main_1_2_3

并将它们分配给变量。

注意:1,2和3只是示例数字,可以更改。

4 个答案:

答案 0 :(得分:2)

你能试试吗?

var="MY_VERSION=1_3_2"
version=$(echo $var | sed 's/.*MAIN_\(.*\)/\1/') #version will be 1_3_2

这使用bash和sed。

答案 1 :(得分:1)

GNU Awk解决方案

$ MY_VERSION=$(awk -F/ '/Main_/ { sub(/Main_/, "", $NF); print $NF }' info.log)
$ echo "$MY_VERSION"
X_1_A

答案 2 :(得分:1)

您可以使用此awk命令:

cat file
/home/jill/Main_1_2_4
/home/jax/Main_1_2_3
/home/john/Main_X_1_A

awk -v u=jax -F '/' '$3==u{sub(/^Main_/, "", $4); print $4}' file
1_2_3

在这里,您可以将u变量中的任何用户名传递给awk(因为jax正在传递此处),并且将从该特定行中选择版本。

答案 3 :(得分:0)

无需外部工具。 Bash可以为你做字符串操作:

$ cat info.log 
/home/jax/Main_X_1_A
$ read -r a < info.log
$ b="${a#*_}"
$ echo "$b"
X_1_A