【问题标题】:sed: Replace a whole line by number overwriting the original filesed:用数字替换整行覆盖原始文件
【发布时间】:2016-03-20 17:56:32
【问题描述】:

我正在 MINIX 上编写一个 BASH shell 脚本,我想用某个字符串的编号完全替换文件的特定行,并且这个替换将覆盖到原始文件。没有印在stdout上。

行号和替换字符串是脚本的变量,名称如下:

line (e.g. 8)
repstring (e.g. "134|Wan|Cho|1988-03-20")

所以我正在尝试以下代码:

sed -i "${line}s/.*/${repstring}/" $filename

但是当我尝试执行脚本时,我收到了消息:

sed: unknown option -- i
usage:  sed [-aEnr] script [file ...]
        sed [-aEnr] [-e script] ... [-f script_file] ... [file ...]

是否可以用其他方式编辑此文件?

附言我知道将sed 的输出重定向到一个新文件,然后将新文件移动到原始文件,但我不想在此过程中创建任何其他文件。

【问题讨论】:

  • 看来你的-i参数无效。查看 sed 的手册页。 -i 参数需要扩展名,在这种情况下,您没有添加扩展名。
  • 我刚刚在这里读到:grymoire.com/Unix/Sed.html#uh-62h 但我已经尝试过pkgin updatepkgin install sed,但它说数据库是最新的。那么手动安装该扩展的正确方法是什么?
  • @ClaudioCorsi -i 选项不需要扩展名即可执行就地编辑,但添加扩展名(例如-i.bak)将创建原始文件的备份,现在具有.bak 扩展名。
  • 它在错误消息中说,他的sed 版本不支持-i 选项。无法使用。

标签: bash sed minix


【解决方案1】:

根据the documentation,MINIX 使用sed 的极简版本。如果您想坚持使用sed,只需使用重定向,然后移动输出文件以替换旧文件。

sed "${line}s/.*/${repstring}/" "$filename" > /tmp/sed.tmp && mv /tmp/sed.tmp "$filename"

或者,使用 Perl:

perl -pi -e "if (\$.==$line) {s/.*/$repstring/ && end}" "$filename"

变量$.代表当前行号。

【讨论】:

  • 这个解决方案可以正常工作。但是是否可以更新 MINIX 使用的 sed 版本以便在不创建任何临时文件的情况下进行此编辑?
  • 您可以下载并编译 GNU 版本,或者只使用 Perl。看看我几秒钟前的最后一次编辑。
  • 好吧,我会尝试下载 GNU 版本以使其工作,如果我仍然无法修复它,我将使用您提到的重定向方法。我不能在这个项目中使用 Perl,因为我还没有被教过它。感谢您的宝贵时间。
  • @thomas_p:您不能指望 sed(即使使用 -i 选项)来更新文件。为了允许大量追加或删除,该软件将在磁盘上的不同位置打开一个新的临时文件,写入新版本,然后将 tmpFile 交换到 origFile 。祝你好运。
  • 哦,感谢您指出这一点。我最终创建了一个临时文件来重定向sed 输出,然后将其与原始文件交换,因为MINIX 不支持sed 的-i 选项。
【解决方案2】:

首先确定在${repstring} 中找不到的字符是什么。当/ 是字符串的一部分时,您希望使用其他一些唯一字符。

可以试试老编辑ed吗?

ed -s "${filename}" << EOF
${linenr}s/.*/${repstring}/g
w
q
EOF

当你不知道什么是独特的字符时,你可以使用

ed -s "${filename}"<< EOF
${linenr}c
${repstring}
.
w
q
EOF

但是你真的应该控制repstring。 猜猜下一个 repstring 会发生什么:

repstring=".
!touch WarnedYou"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 2023-02-03
    • 2017-10-03
    • 2014-04-02
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多