使用Mac的sed命令中的-n问题

时间:2012-07-18 12:34:37

标签: shell sed

我正在编写一个脚本,使用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版本,因为这个脚本不会只在我的计算机上运行。所以任何变通办法都是理想的。

由于

1 个答案:

答案 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