Bash 即使只有一个短语需要替换,如何使用sed替换整行?

Bash 即使只有一个短语需要替换,如何使用sed替换整行?,bash,sed,Bash,Sed,我正在尝试制作一个bash脚本,该脚本进入/etc/login.defs文件并更改网络安全竞赛的密码要求。我对bash和sed命令相当陌生。我想知道如何替换整行文字,即使只搜索其中的一部分。例如,如果我想将您可以保留密码的最长天数更改为7,默认值如下所示: PASS\u MAX\u天数99999 我只需在脚本中运行以下命令: sed-i的/PASS\u MAX\u DAYS 99999/PASS\u MAX\u DAYS 7/'/etc/login.defs 但是如果我运行这个程序,并且logi

我正在尝试制作一个bash脚本,该脚本进入/etc/login.defs文件并更改网络安全竞赛的密码要求。我对bash和sed命令相当陌生。我想知道如何替换整行文字,即使只搜索其中的一部分。例如,如果我想将您可以保留密码的最长天数更改为7,默认值如下所示:

PASS\u MAX\u天数99999

我只需在脚本中运行以下命令:

sed-i的/PASS\u MAX\u DAYS 99999/PASS\u MAX\u DAYS 7/'/etc/login.defs

但是如果我运行这个程序,并且login.defs文件不是默认设置,它将无法工作。有没有办法让我只搜索
PASS\u MAX\u DAYS
并用
PASS\u MAX\u DAYS 7
替换整行内容

如果这是一个愚蠢的问题,我深表歉意,但我无法找到任何回答我问题的答案。

使用sed中的“地址”(有关详细信息,请参阅手册):


作为替代方案,您可以扩展模式以包括整个文本

sed -i 's/PASS_MAX_DAYS .*/PASS_MAX_DAYS    7/' /etc/login.defs

模式中的
*
将在替换文本中包含“PASS\u MAX\u DAYS”之后的任何内容

请尝试
sed-i的/PASS\u MAX\u DAYS.*/PASS\u MAX\u DAYS 7/'/etc/login.defs
。这比下一个更容易崩溃,只是[:space:]](如下所述)更健壮,例如,可以使用TAB作为分隔符。
sed -i 's/PASS_MAX_DAYS .*/PASS_MAX_DAYS    7/' /etc/login.defs