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



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

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

相关内容

  • 没有找到相关文章

最新更新