sed 或 awk 在 RHEL7 上更改文件中的特定数字

sed or awk to change a specific number in a file on RHEL7

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

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

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

谢谢,

约瑟夫

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

的内容
sed '/@student.*hard.*nproc/s/10/25/g' /etc/security/limits.conf
sed -ri '/^#/!s/(^.*)([[:space:]]10$)/ 25/' /etc/security/limits.conf

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

Awk 是另一种选择:

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

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

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

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

使用这个 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