我有一个看起来像这样的文件:
....
....
....
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
....
答案 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
...
...
...