Bash sed:用数字替换整行,覆盖原始文件

Bash sed:用数字替换整行,覆盖原始文件,bash,sed,minix,Bash,Sed,Minix,我正在MINIX上编写bashshell脚本,我想用一个字符串完全替换文件的特定行,并将替换内容覆盖到原始文件中。未打印在标准输出上 行号和替换字符串是脚本的变量,具有以下名称: line (e.g. 8) repstring (e.g. "134|Wan|Cho|1988-03-20") 因此,我尝试以下代码: sed -i "${line}s/.*/${repstring}/" $filename 但是,当我尝试执行脚本时,我得到一个消息: sed: unknown option --

我正在MINIX上编写bashshell脚本,我想用一个字符串完全替换文件的特定行,并将替换内容覆盖到原始文件中。未打印在
标准输出上

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

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 ...]
是否可以以其他方式编辑此文件

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

根据,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"

变量
$。
表示当前行号。

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

你能试试旧的编辑器吗

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

您的-i参数似乎无效。查看sed的手册页。-i参数需要一个扩展,在本例中您没有添加扩展。我只是在这里了解到了这一点:但我已经尝试了
pkgin update
pkgin install sed
,但它说数据库是最新的。那么,手动安装该扩展的正确方法是什么?@ClaudioCorsi
-i
选项不需要扩展来执行就地编辑,但是添加扩展(例如
-i.bak
)将创建原始文件的备份,现在有一个
.bak
扩展。它在错误消息中说,他的
sed
版本不支持
-i
选项。它无法使用。这个解决方案工作正常。但是,是否可以更新MINIX使用的
sed
版本,以便在不创建任何临时文件的情况下进行编辑?您可以下载并编译GNU版本,或者只使用Perl。请看几秒钟前我的最后一次编辑。好吧,我将尝试下载GNU版本以使其正常工作,如果我仍然无法以这种方式修复它,我将使用您提到的重定向方法。我不能在这个项目中使用Perl,因为我还没有被教过它。谢谢您的时间。@thomas\u p:您不能指望sed(即使使用
-i
选项)来更新文件。为了允许大量追加或删除,软件将在磁盘上的不同位置打开一个新的临时文件,写入新版本,然后将tmpFile交换到origFile。祝你好运。哦,谢谢你指出这一点。最后,我创建了一个临时文件来重定向
sed
输出,然后将其与原始输出交换,因为MINIX不支持
sed
的-I选项。
ed -s "${filename}"<< EOF
${linenr}c
${repstring}
.
w
q
EOF
repstring=".
!touch WarnedYou"