我在 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"