Bash中替换特定行(line_3)后首个指定内容(aaa)的方法
替换line_3之后第一个出现的"aaa"
现有文件内容:
line_1 anything anything anything aaa line_2 line_3 anything anything anything aaa anything anything line_4 aaa
需要替换line_3之后出现的第一个aaa,预期输出:
line_1 anything anything anything aaa line_2 line_3 anything anything anything YES REPLACE THIS anything anything line_4 aaa
以下是几种可行的Bash工具解决方案:
方法一:使用sed
利用sed的标签循环,定位到line_3后逐行查找第一个aaa并替换:
sed -i '/line_3/{:loop; n; /aaa/{s//YES REPLACE THIS/; b}; b loop}' file.txt
/line_3/:定位到包含line_3的行:loop:定义循环标签n:读取下一行内容/aaa/{s//YES REPLACE THIS/; b}:如果当前行匹配aaa,执行替换并直接跳出循环b loop:若未匹配到aaa,跳回循环标签继续读取下一行
方法二:使用awk
通过变量标记状态,精准控制只替换line_3后的第一个aaa:
awk '/line_3/{flag=1} flag && /aaa/ && !replaced {sub(/aaa/, "YES REPLACE THIS"); replaced=1} 1' file.txt > temp && mv temp file.txt
/line_3/{flag=1}:匹配到line_3时,设置标记flag为1flag && /aaa/ && !replaced:当已过line_3(flag=1)、当前行是aaa且未执行过替换时,触发替换动作sub(...):执行字符串替换,同时设置replaced=1标记已完成替换,避免后续aaa被修改1:awk的简写语法,代表打印所有行- 最后通过临时文件覆盖原文件(若使用GNU awk 4.1及以上版本,也可直接用
awk -i inplace ...实现原地修改)
内容的提问来源于stack exchange,提问作者BeastMaster64
相关产品推荐
相关产品推荐

