使用变量的部分来修改文本文件中的行

时间:2013-09-12 11:20:56

标签: bash sed awk

我有一个看起来像这样的文件:

....
....
....
MY_TAG=Release_X_Y
....
....

第四行总是这样,包含数字。例如。 Release_1_1

我将拥有的值是用户传递的参数,如下所示:

1_2_3 

其中1,2,3将始终用下划线分隔,但会改变数字。

我需要取前两个数字,即1和2,然后用它们替换我的文本文件中的MY_TAG行。用sed或awk可以做到这一点吗?

总结:

预先存在的文件

....
MY_TAG=Release_1_2  <---Line 4
....

用户将参数传递给我的脚本并将其存储为变量:

User arg = 4_9_2

我想修改上面提到的文件:

....
MY_TAG=Release_4_9
....

4 个答案:

答案 0 :(得分:1)

#!/bin/bash
RELEASE=${1%_*}  # Trim the last _X from the release number
sed -e "s/^MY_TAG=Release_[0-9_]*/MY_TAG=Release_$RELEASE/" -i file_path

答案 1 :(得分:0)

试试这个单行:

 awk -v arg="4_9_2" 'BEGIN{FS=OFS="=";sub(/_[^_]*$/,"",arg)}NR==4{$2="Release_"arg}7' file

arg="4_9_2"可以是arg="$var"$var是一个变量,由用户输入传入。

答案 2 :(得分:0)

这可能在awk中,但恕我直言sed在这里是一个更好的匹配。

第一步是隔离您操作的线路。这确实可以通过行号(sed地址4)来完成。或者,您可能希望在输入文件格式可能发展的情况下使用更强大的内容,例如:一个正则表达式。

您要将“Release_1_2”替换为“Release_4_9”。正则表达式替换非常适合这项工作:s/Release_.*/Release_4_9/

完整的工作命令应该是:sed -e "4 s/Release_.*/Release_4_9/"。假设您的目标版本号是shell变量RELEASE,您可以这样插入:sed -e "4 s/Release_.*/Release_$RELEASE/"

此调用是一个过滤器:它将您的文件作为标准输入(或作为命令行参数)并打印结果。要使用最新的sed GNU版本对其进行就地修改,请使用-i选项:

RELEASE=4_9
sed -e "4 s/Release_.*/Release_$RELEASE/" -i file

答案 3 :(得分:0)

你可以有这样的脚本:

#!/bin/bash
FILE=$1
ARG=$2
[[ -e $FILE && $ARG =~ ^[^_]+_[^_]+ ]] && sed -i "/^MY_TAG=/{ s|^\(MY_TAG=[^_]*\).*|\1_${BASH_REMATCH[0]}|; }" "$FILE"  

示例:

bash script.sh file 1_4_5

输出:

...
...
...
MY_TAG=Release_1_4
...
...
...