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

时间:2016-03-20 17:56:32

标签: bash sed minix

我在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的输出重定向到新文件,然后将新文件移动到原始文件,但我不想在此过程中创建任何其他文件。

2 个答案:

答案 0 :(得分: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"

变量$.代表当前行号。

答案 1 :(得分:1)

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