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

Bash 使用部分变量修改文本文件中的行,bash,sed,awk,Bash,Sed,Awk,我有一个文件如下所示: .... .... .... MY_TAG=Release_X_Y .... .... 第四行看起来总是这样,并且包含数字。例如,释放\u 1\u 1 我将拥有的值是用户传递的参数,如下所示: 1_2_3 #!/bin/bash FILE=$1 ARG=$2 [[ -e $FILE && $ARG =~ ^[^_]+_[^_]+ ]] && sed -i "/^MY_TAG=/{ s|^\(MY_TAG=[^_]*\).*|\1_${

我有一个文件如下所示:

....
....
....
MY_TAG=Release_X_Y
....
....
第四行看起来总是这样,并且包含数字。例如,释放\u 1\u 1

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

1_2_3 
#!/bin/bash
FILE=$1
ARG=$2
[[ -e $FILE && $ARG =~ ^[^_]+_[^_]+ ]] && sed -i "/^MY_TAG=/{ s|^\(MY_TAG=[^_]*\).*|\1_${BASH_REMATCH[0]}|; }" "$FILE"  
其中1、2、3将始终用下划线分隔,但会改变数字

我需要取前两个数字,即1和2,并用它们替换文本文件中的行MY_标记。是否可以使用sed或awk执行此操作

总结如下:

预先存在的文件

....
MY_TAG=Release_1_2  <---Line 4
....
我想将上述文件修改为:

....
MY_TAG=Release_4_9
....
试试这一行:

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

arg=“4_9_2”
可以是
arg=“$var”
,它是一个由用户输入的应变量。

在awk中是可能的,但IMHO sed在这里更匹配

第一步是隔离您操作的线路。这确实可以通过行号(sed地址
4
)完成。或者,您可能希望使用更健壮的工具,以防输入文件格式可能发生变化,例如正则表达式

在这里,您希望将“Release_1_2”替换为“Release_4_9”。正则表达式替换非常适合此作业:
s/Release.*/Release\u 4\u 9/

完整的工作命令应该是:
sed-e“4s/Release.*/Release\u4\u9/”
。假设您的目标版本号在shell变量release中,您可以这样插值:
sed-e“4s/release.*/release\u$release/”

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

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

您可以使用如下脚本:

1_2_3 
#!/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
...
...
...

嘿,谢谢你的回复。我不得不稍微修改它,因为我现有的sed版本不支持-I。干得好,干杯。