MacOS下编写Bash通用函数:多行字符串不存在则追加至文件
解决MacOS下Bash多行字符串追加判断问题
问题分析
现有grep方案仅能处理单行字符串,因为grep默认按行匹配,无法识别多行的完整文本块。MacOS使用BSD版本的grep,部分Linux专属方案(如GNU grep的特定参数)无法直接复用,因此我们采用系统自带的awk来实现需求,无需额外安装工具。
可行实现方案
以下是适配MacOS的append函数,支持多行转义字符串的检测与追加:
append() { # 解析输入的转义字符(如\n、\t)为实际字符 local target_content=$(echo -e "$1") local target_file="$2" # 若目标文件不存在,直接写入内容 if [ ! -f "$target_file" ]; then echo -e "$1" >> "$target_file" return 0 fi # 使用awk逐行匹配完整的多行文本块 awk -v content="$target_content" ' BEGIN { # 将目标内容按换行分割为行数组 line_count = split(content, target_lines, /\n/) current_match_idx = 1 } { # 当前行匹配目标数组的对应行,推进匹配索引 if ($0 == target_lines[current_match_idx]) { current_match_idx++ # 匹配完所有行,标记为找到并退出 if (current_match_idx > line_count) { found = 1 exit } } else { # 匹配中断,重置索引并检查当前行是否是新匹配的起点 current_match_idx = 1 if ($0 == target_lines[current_match_idx]) { current_match_idx++ } } } END { # 找到则退出码0,未找到则非0 exit !found } ' "$target_file" # 根据awk的结果判断是否追加内容 if [ $? -eq 0 ]; then echo "内容已存在于文件中" return 1 else echo -e "$1" >> "$target_file" echo "内容已追加至文件" return 0 fi }
使用说明
- 将上述函数添加到你的Bash脚本或
~/.bashrc/~/.zshrc中(根据你使用的shell)。 - 按示例调用即可:
append 'sometext\nthat spans\n\tmutliple lines' ~/textfile.txt
关键细节
- 转义字符解析:使用
echo -e将输入字符串中的\n(换行)、\t(制表符)等转义序列转换为实际字符,确保匹配逻辑与最终写入的内容一致。 - 多行匹配逻辑:awk将目标内容拆分为行数组,遍历文件时连续匹配所有行才判定为内容存在,避免部分行匹配导致的误判。
- 兼容性:完全依赖MacOS系统自带的bash和awk,无需额外安装任何工具。
内容的提问来源于stack exchange,提问作者madcapnmckay
相关产品推荐
相关产品推荐

