Shell 为变量指定文件中字符串的值

Shell 为变量指定文件中字符串的值,shell,sed,awk,Shell,Sed,Awk,我有一个名为info.log的文件,其中包含以下行: /home/jax/Main_X_1_A X、1和A是有意义的,它们可以改变。然而,“主要”和下划线保持不变。 是否可以使用实用程序根据info.log中的信息为shell变量赋值 例如 其中,问号表示在这些位置找到的单个字符。 例如,如果info.log包含此行: /home/jax/Main_1_2_3 我们使用这些数据初始化一个shell变量: MY_VERSION=... echo $MY_VERSION 产出将是: 1_2_3

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

/home/jax/Main_X_1_A
X1A是有意义的,它们可以改变。然而,“主要”和下划线保持不变。 是否可以使用实用程序根据info.log中的信息为shell变量赋值

例如

其中,问号表示在这些位置找到的单个字符。 例如,如果info.log包含此行:

/home/jax/Main_1_2_3
我们使用这些数据初始化一个shell变量:

MY_VERSION=...
echo $MY_VERSION
产出将是:

1_2_3

用更好的例子更新问题:

信息日志

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):

并将它们分配给变量

注:1、2和3只是示例数字,它们可以更改

你能试试这个吗

var="MY_VERSION=1_3_2"
version=$(echo $var | sed 's/.*MAIN_\(.*\)/\1/') #version will be 1_3_2
这使用了bash和sed。

你能试试吗

var="MY_VERSION=1_3_2"
version=$(echo $var | sed 's/.*MAIN_\(.*\)/\1/') #version will be 1_3_2
这使用了bash和sed。

GNU Awk解决方案 GNU-Awk解决方案
您可以使用此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
正在这里传递),并且将从该特定行中选择版本。

您可以使用此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
正在这里传递),并且将从该特定行中选择版本。

无需外部实用程序。Bash可以为您执行字符串操作:

$ cat info.log 
/home/jax/Main_X_1_A
$ read -r a < info.log
$ b="${a#*_}"
$ echo "$b"
X_1_A
$cat info.log
/home/jax/Main_X_1_A
$read-ra
无需外部实用程序。Bash可以为您执行字符串操作:

$ cat info.log 
/home/jax/Main_X_1_A
$ read -r a < info.log
$ b="${a#*_}"
$ echo "$b"
X_1_A
$cat info.log
/home/jax/Main_X_1_A
$read-ra
这是可行的-是否有任何方法可以扩展它?在我的info.log中,我有几个绝对路径,如下所示:
/home/jax/Main_1_2_3,/home/jane/Main_1_2_5
如果您遵循,我只想使用一个绝对路径的值?此外,您是否能够详细介绍它的工作原理?如果有多行,您如何决定使用哪一行?我知道我要使用的行的绝对路径,直到我尝试剥离值的最后一部分。例如,
/home/jax/Main_1_2_3/home/jill/Main_1_2_4
我希望从/home/jax/剥离我的值,这样回声将产生1_2_3。@先生,如果有另一行像
/home/jax/Main_1_2_4
会怎样?这行得通——有没有扩展它的方法?在我的info.log中,我有几个绝对路径,如下所示:
/home/jax/Main_1_2_3,/home/jane/Main_1_2_5
如果您遵循,我只想使用一个绝对路径的值?此外,您是否能够详细介绍它的工作原理?如果有多行,您如何决定使用哪一行?我知道我要使用的行的绝对路径,直到我尝试剥离值的最后一部分。例如,
/home/jax/Main_1_2_3/home/jill/Main_1_2_4
我希望我的值从/home/jax/中剥离出来,这样回声将产生1_2_3。@sugartastee先生,如果还有另一行像
/home/jax/Main_1_2_4
,我想你需要用更好的语料库和更多你想要的输出的例子来更新你的问题。从下面的评论来看,您的问题中似乎缺少一些需求和边缘案例。我认为您需要用更好的语料库和更多所需输出的示例来更新您的问题。从下面的评论来看,您的问题中似乎缺少一些需求和边缘案例。