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

sed: Replace a whole line by number overwriting the original file

我正在 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 ...]

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

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

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

变量$.表示当前行号。

首先确定您在 ${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"