Shell Mac的sed命令中存在-n问题

Shell Mac的sed命令中存在-n问题,shell,sed,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部分不起作用,因为这会抑制所有行的打印,但其中包含

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


谢谢

我假设您的
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

中,在Mac*Nix或Linux上,-n选项的作用与您认为的不同。你应该参考手册页了解更多细节。适用于我,在mac上。简化先让
sed-n'/version:/p'temp.txt
工作。@Beta-Hmmmm这让我很困惑。我还没有处理好你关于让
sed-n'/version:/p'temp.txt
工作的建议。仅此命令仍会打印出整个文本文件temp.txt。什么?就好像整个文件被视为一行。当你说整个文件时,我们谈论的是多少行?Sed不能很好地处理老式mac风格的行结尾,因为你的文件可能正在使用它们。试试
$file temp.txt
。如果它显示
temp.txt:ASCII文本,带有CR行终止符,那么这就是您的问题。