如何编写Bash脚本按行处理文件,为符合条件的行添加#前缀?
如何编写Bash脚本按行处理文件,为符合条件的行添加#前缀?
嘿,我看你当前的脚本存在语法和逻辑问题,没法实现你想要的效果——给符合条件的行(非注释行且包含ab.com或xyz)添加#前缀。我来帮你修正并理清思路:
首先明确核心需求:
- 读取
/etc/filesystem.txt的每一行 - 对不以
#开头,且**包含ab.com或者xyz**的行,在行首添加# - 其他行保持原样,最终输出到
/etc/abc.txt
修正后的完整脚本
#!/bin/bash set -x # 调整文件权限(建议用更安全的644,而非过于开放的777) chmod 644 /etc/filesystem.txt input_file="/etc/filesystem.txt" output_file="/etc/abc.txt" # 用awk高效处理行匹配与修改 awk ' # 匹配非注释行 + 包含目标关键词的行 !/^#/ && (/ab.com/ || /xyz/) { print "#" $0 next } # 其他行直接输出原内容 { print $0 } ' "$input_file" > "$output_file"
关键细节解释
- 权限调整:把原脚本的
777改成644,避免因权限过度开放带来的安全风险,实际可根据你的需求微调。 - awk逻辑优化:用awk一行搞定行匹配与修改,比嵌套循环更简洁高效:
!/^#/:排除已经是注释的行(避免重复加#)(/ab.com/ || /xyz/):匹配包含任意一个关键词的行(如果你的需求是同时包含两个关键词,把||改成&&即可)- 符合条件的行拼接
#后输出,不符合的直接输出原行
- 输出方式:用
>直接覆盖输出文件,避免重复执行脚本时内容累加,若需要追加可改回>>。
测试验证
用你给出的示例输入:
/dev/f1 /dev/f2 #/dev/f3 /dev/ab.com /dev/xyz
运行脚本后,/etc/abc.txt的内容会和你预期的完全一致:
/dev/f1 /dev/f2 #/dev/f3 #/dev/ab.com #/dev/xyz
备注:内容来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

