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行终止符,那么这就是您的问题。