【问题标题】:sed or awk to change a specific number in a file on RHEL7sed 或 awk 更改 RHEL7 文件中的特定数字
【发布时间】:2021-05-03 11:29:55
【问题描述】:

我需要帮助找出语法或使用什么命令来查找替换文件中的特定数字。 我需要在配置文件中将数字 10 替换为 25。我尝试了以下方法:

sed 's/10/25/g' /etc/security/limits.conf

这会将其他包含 10 的实例(例如 1000 和 10000)更改为 2500 和 25000,我需要将需求更改为仅将 10 更改为 25。请帮助。

谢谢,

约瑟夫

【问题讨论】:

    标签: sed sh redhat


    【解决方案1】:

    使用这个 Perl 单行符,其中 \b 代表分词(这样 10 将不匹配 210 或 102):

    perl -pe 's/\b10\b/25/g' in_file > out_file
    

    或就地更改文件:

    perl -i.bak -pe 's/\b10\b/25/g' in_file
    

    Perl 单行程序使用这些命令行标志:
    -e:告诉 Perl 查找内联代码,而不是在文件中。
    -p:循环输入一行一次,默认分配给$_。在每次循环迭代后添加print $_
    -i.bak:就地编辑输入文件(覆盖输入文件)。在覆盖之前,保存原始文件的备份副本,方法是在其名称后附加扩展名 .bak

    正则表达式使用修饰符/g:重复匹配模式。

    另请参阅:
    perldoc perlrun: how to execute the Perl interpreter: command line switches
    perldoc perlrequick: Perl regular expressions quick start

    【讨论】:

      【解决方案2】:
      sed -ri '/^#/!s/(^.*)([[:space:]]10$)/\1 25/' /etc/security/limits.conf
      

      启用正则表达式解释(-r 或 -E)后,使用 ! 处理所有不以 # 开头的行然后我们将这些行分成两部分,并替换第一部分的行,后跟一个空格和 25。$ 确保要替换的条目锚定在行尾。

      Awk 是另一种选择:

      awk -i 'NF==4 && $4==10 { gsub("10","25",$4) }1' /etc/security/limits.conf
      

      检查该行是否有 4 个空格分隔的字段 (NF==4) 并且第 4 个字段 ($4) 为 10。如果满足此条件,请使用 gsub 将 10 替换为 25,并使用 1 打印所有行

      -i 是 awk 较新版本上的就地修改标志。如果没有兼容的版本,请使用:

      awk 'NF==4 && $4==10 { gsub("10","25",$4) }1' /etc/security/limits.conf > /etc/security/limits.tmp && mv -f /etc/security/limits.tmp /etc/security/limits.conf
      

      【讨论】:

        【解决方案3】:

        这里的技巧是将sed 替换限制为您要更改的行。对于limits.conf,您最好匹配域、类型和项目。因此,如果您只想更改域@student 的限制,输入hard,项目nproc,您可以使用类似

        sed '/@student.*hard.*nproc/s/10/25/g' /etc/security/limits.conf
        

        【讨论】:

        • 乔恩,谢谢你说的很到位!非常感谢您对此的帮助。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-19
        • 2012-04-17
        • 2019-09-16
        • 2015-03-19
        相关资源
        最近更新 更多