【发布时间】:2021-05-03 11:29:55
【问题描述】:
我需要帮助找出语法或使用什么命令来查找替换文件中的特定数字。 我需要在配置文件中将数字 10 替换为 25。我尝试了以下方法:
sed 's/10/25/g' /etc/security/limits.conf
这会将其他包含 10 的实例(例如 1000 和 10000)更改为 2500 和 25000,我需要将需求更改为仅将 10 更改为 25。请帮助。
谢谢,
约瑟夫
【问题讨论】:
我需要帮助找出语法或使用什么命令来查找替换文件中的特定数字。 我需要在配置文件中将数字 10 替换为 25。我尝试了以下方法:
sed 's/10/25/g' /etc/security/limits.conf
这会将其他包含 10 的实例(例如 1000 和 10000)更改为 2500 和 25000,我需要将需求更改为仅将 10 更改为 25。请帮助。
谢谢,
约瑟夫
【问题讨论】:
使用这个 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 switchesperldoc perlrequick: Perl regular expressions quick start
【讨论】:
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
【讨论】:
这里的技巧是将sed 替换限制为您要更改的行。对于limits.conf,您最好匹配域、类型和项目。因此,如果您只想更改域@student 的限制,输入hard,项目nproc,您可以使用类似
sed '/@student.*hard.*nproc/s/10/25/g' /etc/security/limits.conf
【讨论】: