【问题标题】:Need help in sed and awk commands在 sed 和 awk 命令方面需要帮助
【发布时间】:2018-04-04 07:16:04
【问题描述】:

我有一个包含内容的文本文件:(version.txt)

#Project Name: XYZ
#Module Name: ABC
#
#
currentVersion=9.2.04

现在我有一个如下所示的 shell 脚本,它将 version.txt 的最后一行替换为 currentVersion=9.2.05

脚本:

ls_version=`grep -i currentVersion version.txt | awk '{print $NF}'`
counter=`echo $ls_version | awk -F . '{print $NF}'`
fs_version=`echo $ls_version | awk -F"." -v OFS='.' '{$NF=""; print $0}'`
echo "counter b4 addition: $counter"
counter=`expr ${counter} + 1`
version=`echo ${fs_version}$counter`
echo "ls_version: $ls_version"
echo "fs_version: $fs_version"
echo "counter post addition: $counter"
echo "final version: $version"
sed -i -e "s/\(currentVersion=\).*/\1$version/" version.txt

但它却给出了这样的 o/p:

currentVersion=05
currentVersion=05
currentVersion=05
currentVersion=05
currentVersion=05
currentVersion=05
currentVersion=05

你能告诉我这个脚本有什么问题吗?

提前致谢

【问题讨论】:

  • 错的太多了....不要通过管道将grep传输到awk,不要存储awk的输出然后使用echo将其传输到另一个awk,不要使用expr ,不要使用 'sed -i',使用 $() 代替反引号。这不是一份详尽的清单。
  • 我在您的最终sed 中看不到任何会导致文件内容将每一行替换为“currentVersion=05”的内容。要调试它,请停止使用sed -i 并显示实际输出(例如,“计数器 b4 加法”发生了什么?也许您正在运行的代码不是您正在显示的代码)、实际输入和实际代码。
  • @William Pursell,感谢您的回复。删除 sed -I 后。我在 version.txt 文件中看不到任何更改/更新。
  • 代码执行:counter b4 addition: currentVersion=04 ls_version: currentVersion=04 fs_version: empty counter post addition:05 final version : current_Version=05 (multiple entries)

标签: shell awk sed


【解决方案1】:

遵循 awk 将帮助您增加 Input_file 中的版本。

awk -F'.' '/currentVersion/{$3=sprintf("%02d",$3+1)"}"} 1' OFS="."   Input_file

输出如下。

{#Project Name: XYZ
#Module Name: ABC
#
#
currentVersion=9.2.05}

【讨论】:

  • 计数器变量呢?我在这里也使用它吗?
【解决方案2】:

基于this,我写道:

 perl -pe 's/^currentVersion=((\d+\.)*)(\d+)(.*)$/$1.(sprintf("%02d", $3+1)).$4/e' file.txt

【讨论】:

  • 感谢您的回复。抱歉,我不能在这里使用 perl。我需要坚持使用 shell 脚本
猜你喜欢
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 2022-10-24
  • 2013-07-26
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
相关资源
最近更新 更多