【问题标题】:Trouble with -n in sed command with MacMac 的 sed 命令中的 -n 出现问题
【发布时间】:2023-03-20 07:10:02
【问题描述】:

我正在编写一个脚本,使用sed 在一个文件中查找一个字符串 - temp.txt(版本号),然后获取该字符串并更新另一个文件中的版本号。这里是相关代码sn-p。

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 版本,因为这个脚本不会只在我的计算机上运行。所以任何解决方法都是理想的。

谢谢

【问题讨论】:

  • 在 Mac *Nix 或 Linux 上,-n 选项并不像您认为的那样。您应该查阅手册页以获取更多详细信息。
  • 在 Mac 上为我工作。简化;尝试让sed -n '/version: /p' temp.txt 先工作。
  • @Beta 嗯,这让我很困惑。我没有处理您让sed -n '/version: /p' temp.txt 工作的建议。仅该命令仍会打印出整个文本文件 temp.txt。哇?就好像整个文件被视为一行一样。
  • 当你说整个文件时,我们指的是多少行?
  • Sed 不适用于老式 mac 风格的行尾,如果您的文件正在使用它们。试试$ file temp.txt。如果它显示temp.txt: ASCII text, with CR line terminators,那就是你的问题。

标签: shell sed


【解决方案1】:

我假设你 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”。

在第二个命令中,我将替换写入旧版本的行。注意我不关心“版本:”字符串后面的内容,因为我将用我的新版本号替换它。我还将file2.txt 的备份保存到file2.txt.bk

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 2013-07-08
    • 2018-03-21
    • 2023-03-24
    • 2015-12-13
    相关资源
    最近更新 更多