0

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

....
....
....
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

4 回答 4

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
于 2013-09-12T11:38:18.677 回答
0

在 awk 中是可能的,但恕我直言 sed 在这里更合适。

第一步是隔离您操作的线路。这确实可以通过行号(sed 地址4)来完成。或者您可能想使用更强大的东西以防输入文件格式可能会演变,例如正则表达式。

你想用“Release_4_9”替换“Release_1_2”。正则表达式替换非常适合这项工作:s/Release_.*/Release_4_9/.

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

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

RELEASE=4_9
sed -e "4 s/Release_.*/Release_$RELEASE/" -i file
于 2013-09-12T11:35:13.913 回答
0

试试这个单行:

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

arg="4_9_2"could be arg="$var",它是$var一个shall 变量,由用户输入传入。

于 2013-09-12T11:33:07.827 回答
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
...
...
...
于 2013-09-12T11:41:05.300 回答