【发布时间】:2016-07-30 21:32:34
【问题描述】:
我不太擅长 linux shell 脚本,我需要的帮助很少。
我想通过脚本编辑文件(找到行并编辑)。
原行是:
# JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname="
我想取消注释并使用 127.0.0.1 重播主机名
JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=127.0.0.1"
【问题讨论】:
我不太擅长 linux shell 脚本,我需要的帮助很少。
我想通过脚本编辑文件(找到行并编辑)。
原行是:
# JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname="
我想取消注释并使用 127.0.0.1 重播主机名
JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=127.0.0.1"
【问题讨论】:
你可以参考set命令,把文件名改成你正在工作的名字,
sed -i 's@# JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=< hostname >"@JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=127.0.0.1"@' filename
【讨论】:
很好的答案,但他们没有通过教绅士如何以及为什么工作来做任何事情。
如果您使用的是普通文本编辑器 ed,则在调用命令“ed filename”后将使用三个命令:
s/^# //
s//127.0.0.1/
w
因此,您可以使用管道将这些命令直接提交给 ed,指定“-”作为其第一个参数,这样它就不会在读入和写出文件时报告字符数而打扰您:
( echo 's/^# //'; echo 's//127.0.0.1/'; echo w ) | ed - 文件名
你也不需要回显 'q' 因为 ed 在输入用完或遇到“文件结尾”时会自动退出(你可以在键盘上通过按 CTRL-D 键而不是实际输入 q )。
【讨论】:
这是一种方法:
sed -i -e 's/# \(JVM_OPTS=.*=\).*/\1127.0.0.1"/' path/to/file
也就是说,用\(JVM_OPTS=.*=\) 组中捕获的文本替换该行,因此从JVM_OPTS= 到另一个= 符号的所有内容,并将127.0.0.1" 附加到末尾。
如果文件中可能还有其他行以# JVM_OPTS= 开头,
那么你可以使模式匹配更严格,例如:
sed -i -e 's/# \(JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=\).*/\1127.0.0.1"/' path/to/file
【讨论】:
path/to/filee 的备份。正确的语法是-i -e。