我正在编写一个脚本,使用sed
在一个文件中查找字符串 - temp.txt (版本号)并获取此字符串并在另一个文件中更新版本号文件。以下是相关的代码段。
new=$(sed -n '/version: /p' temp.txt)
sed -i .bk "s/version: [.0-9]*/version: $new/" file2.txt
我遇到的问题是变量new
不仅仅带有版本号的一行,而是取整个文件, file2.txt 。这让我相信命令的-n
部分无法正常工作,因为这会抑制所有行的打印,但会禁止打印字符串version
。
我认为这可能是我使用的sed
版本的问题(在Mac上)。或者,我可能错误地使用sed
命令。任何帮助将不胜感激。
我不想更新我的sed
版本,因为这个脚本不会只在我的计算机上运行。所以任何变通办法都是理想的。
由于
答案 0 :(得分:0)
我认为你temp.txt
看起来像这样:
# some text
version: 3.14
# more text
你的file2.txt
相似。只有一个“版本:”存在。
如果是这样,您可以使用以下脚本:
#!/bin/bash
new=$(cat temp.txt | grep version: | sed "s/ //g" | cut -d ":" -f 2)
sed -i "bk" -E "s/version:.*/version: ${new}/" file2.txt
第一个命令查找写入版本的行。我使用sed
删除任何额外空格,cut
提取版本号。使用此命令,版本号也可以是“3.6.7a”。
在第二个命令中,我将替换写入旧版本的行。请注意我不关心“version:”字符串背后的内容,因为我将用我的新版本号替换它。我还要将file2.txt
的备份保存到file2.txt.bk
。