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