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

时间:2015-03-17 01:53:46

标签: sed

我想从

更改/etc/security/limits.conf中的以下行
#*               soft    core           0

*               soft    core            unlimited

启用核心转储。

我尝试使用以下sed命令,但它什么也没做:

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

我哪里做错了?

2 个答案:

答案 0 :(得分:4)

sed

的力学

存在各种问题:

  1. 您不需要#前面的反斜杠,也不需要替换文本中*前面的反斜杠。他们没有太大的伤害,但他们没有必要。
  2. 您需要在core和数字之间留出空格。
  3. 您不允许文件中包含空格和标签。
  4. 您不允许在该行上留下空格(这可能无关紧要)。
  5. 您没有明确启用扩展正则表达式,并且您确实使用了旧式\(…\)捕获表示法,但这意味着+没有特殊含义。
  6. 您没有使用-i选项修改文件(在sed命令正确的情况下没问题。)
  7. 你应该可以使用(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)的优点是连续文件按日期顺序排序,没有任何特殊的排序选项。如果您愿意,可以将标点符号添加到日期/时间格式中。

    无论哪种方式,如果新文件出现问题,您可以获得原件的(副本),以便系统在合理可行的情况下尽快顺利运行。

答案 1 :(得分:1)

awk应该:

awk '/^#.*soft.*core/ {sub(/^#/,"");sub(/0$/,"unlimited")}1' file
*               soft    core           unlimited