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。干得好,干杯。