使用 sed 更改配置文件的条目

Her*_*man 0 sed

我想将 /etc/security/limits.conf 中的以下行更改为

#*               soft    core           0
Run Code Online (Sandbox Code Playgroud)

*               soft    core            unlimited
Run Code Online (Sandbox Code Playgroud)

启用核心转储。

我尝试使用以下 sed 命令,但它没有执行任何操作:

sed -e "s/^\#\*\([ ]+soft[ ]+core\)[0-9][0-9]*$/\*\1 unlimited/" limits.conf
Run Code Online (Sandbox Code Playgroud)

我哪里做错了?

Jon*_*ler 5

力学sed

\n\n

有各种各样的问题:

\n\n
    \n
  1. 您不需要在替换文本中的前面#或 前面使用反斜杠。*它们不会造成太大伤害,但没有必要。
  2. \n
  3. 您需要在core和 数字之间留出空格。
  4. \n
  5. 您不允许文件中存在空格和制表符。
  6. \n
  7. 您不允许行中存在尾随空格(这可能并不重要)。
  8. \n
  9. 您没有显式启用扩展正则表达式,并且确实使用了旧式\\(\xe2\x80\xa6\\)捕获表示法,但这意味着+没有特殊含义。
  10. \n
  11. 您没有使用该选项修改文件-i(当您获得sed正确的命令时这很好)。
  12. \n
\n\n

您应该能够使用(GNU sed):

\n\n
sed -r -e "s/^#\\*([[:space:]]+soft[[:space:]]+core)[[:space:]]+[0-9][0-9]*[[:space:]]*$/\\*\\1 unlimited/" limits.conf\n
Run Code Online (Sandbox Code Playgroud)\n\n

[[:space:]]符号可识别各种空白(包括换行符等);[[:blank:]]如果您愿意,也可以使用仅识别空格和制表符的方法。

\n\n

您还可以使用旧式表示法:

\n\n
sed -e "s/^#\\*\\([[:space:]]\\{1,\\}soft[[:space:]]\\{1,\\}core\\)[[:space:]]\\{1,\\}[0-9][0-9]*[[:space:]]*$/*\\1 unlimited/" limits.conf\n
Run Code Online (Sandbox Code Playgroud)\n\n

core如果您想保留和 数字之间的空格,您可以:

\n\n
sed -e "s/^#\\*\\([[:space:]]\\{1,\\}soft[[:space:]]\\{1,\\}core[[:space:]]\\{1,\\}\\)[0-9][0-9]*[[:space:]]*$/*\\1unlimited/" limits.conf\n
Run Code Online (Sandbox Code Playgroud)\n\n

捕获的结束位置已移动,并且无需在替换字符串中添加空格。

\n\n

修改系统文件时要小心

\n\n

请注意,当您确定脚本已准备好修改生产文件时,您应该非常小心。我通常创建一个新文件,检查它,然后将旧文件复制到带有日期/时间戳的文件名,然后将新文件复制到原始文件上。或者,使用带有 的后缀-i,可能再次带有日期/时间。

\n\n
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\n
Run Code Online (Sandbox Code Playgroud)\n\n

该格式(基于 ISO 8601:2004)的优点是连续的文件按日期顺序排序,无需任何特殊的排序选项。如果您愿意,您可以在日期/时间格式中添加标点符号。

\n\n

无论哪种方式,如果新文件出现问题,您都会获得原始文件(的副本),您可以将其放回原处,以便系统能够尽快地再次顺利运行。

\n