如何编写Shell脚本查找SOME_WORD并复制行替换为NEW_WORLD
解决文本行复制替换问题
原脚本存在的问题
- 错误的判断逻辑:
if [ -z "$file_path" ];是检查文件路径是否为空,和是否找到目标内容无关,完全起不到检测作用。 - 循环修改原文件导致读取异常:
while read读取文件时,同时用sed -i修改原文件,会打乱文件读取指针,导致处理结果混乱。 - Sed命令逻辑错误:原sed命令的匹配和替换逻辑不符合需求,且直接用变量
$line作为匹配模式,若行内包含/、.等sed特殊字符会触发语法错误。
正确实现脚本
直接用sed即可完成需求,无需复杂循环:
search_value="SOME_WORD" replace_value="NEW_WORLD" file_path="./abc.ts" # 检查文件是否存在 if [ ! -f "$file_path" ]; then echo "文件不存在: $file_path" exit 1 fi # 使用sed处理:匹配含search_value的行,先输出原行,再输出替换后的行 sed -i "/$search_value/{p; s/$search_value/$replace_value/}" "$file_path"
脚本说明
/ $search_value /:匹配包含目标关键词的行。p:输出当前匹配到的原行。s/$search_value/$replace_value/:将当前行的目标关键词替换为新内容,然后输出修改后的行。- 若使用macOS的sed,需将
-i改为-i '',避免生成备份文件。
验证效果
执行前文件内容:
SOME_WORD_1: 'ABC', BAD_WORD_1: 'ABC', SOME_WORD_2: 'ABC', BAD_WORD_1: 'ABC', SOME_WORD_3: 'ABC'
执行后文件内容:
SOME_WORD_1: 'ABC', NEW_WORLD_1: 'ABC', BAD_WORD_1: 'ABC', SOME_WORD_2: 'ABC', NEW_WORLD_2: 'ABC', BAD_WORD_1: 'ABC', SOME_WORD_3: 'ABC', NEW_WORLD_3: 'ABC'
内容的提问来源于stack exchange,提问作者James Lee
相关产品推荐
相关产品推荐

