sed 的机制
有各种各样的问题:
- 在替换文本中
# 和* 前面不需要反斜杠。它们不会造成太大伤害,但也不是必需的。
- 您需要在
core 和数字之间留出空格。
- 文件中不允许有空格和制表符。
- 您不允许在行尾添加空格(这可能无关紧要)。
- 您没有显式启用扩展正则表达式,并且确实使用了旧式
\(…\) 捕获表示法,但这意味着 + 没有特殊含义。
- 您没有使用
-i 选项修改文件(这很好,当您得到正确的 sed 命令时)。
你应该可以使用(GNU sed):
sed -r -e "s/^#\*([[:space:]]+soft[[:space:]]+core)[[:space:]]+[0-9][0-9]*[[:space:]]*$/\*\1 unlimited/" limits.conf
[[:space:]] 表示法可以识别各种空格(包括换行符等);你也可以使用[[:blank:]],如果你愿意,它只识别空格和制表符。
您也可以使用旧式表示法:
sed -e "s/^#\*\([[:space:]]\{1,\}soft[[:space:]]\{1,\}core\)[[:space:]]\{1,\}[0-9][0-9]*[[:space:]]*$/*\1 unlimited/" limits.conf
如果你想保留core和数字之间的空白,你可以:
sed -e "s/^#\*\([[:space:]]\{1,\}soft[[:space:]]\{1,\}core[[:space:]]\{1,\}\)[0-9][0-9]*[[:space:]]*$/*\1unlimited/" limits.conf
捕获的关闭被移动,并且不需要在替换字符串中添加空格。
修改系统文件需谨慎
请注意,当您确定您的脚本已准备好修改生产文件时,您应该非常小心。我通常创建一个新文件,检查它,然后将旧文件复制到带有日期/时间戳的文件名,然后将新文件复制到原始文件上。或者,使用带有-i 的后缀,可能又带有日期/时间。
sed -i .$(date +'%Y%m%d.%H%M%S') -e "s/^#\*\([[:space:]]\{1,\}soft[[:space:]]\{1,\}core[[:space:]]\{1,\}\)[0-9][0-9]*[[:space:]]*$/*\1unlimited/" limits.conf
这种格式(基于 ISO 8601:2004)的优点是连续文件按日期顺序排序,无需任何特殊排序选项。如果您愿意,可以在日期/时间格式中添加标点符号。
无论哪种方式,如果新文件出现问题,您将获得(一份)原件,您可以将其放回原件,以便系统在合理可行的情况下以最快的速度再次平稳运行。