You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中从'{'处换行并递归提取目录下C函数定义

解决Bash脚本提取C函数定义的格式问题:在'{'处换行

我来帮你搞定这个问题!首先给你一个修正后的完整脚本,能递归遍历指定目录的.c文件,提取函数定义并按你想要的格式输出:

#!/bin/bash

dirName="$1"

# 检查传入的目录是否存在
if [[ -d "$dirName" ]]; then
    # 递归找所有.c文件,提取函数定义行,再处理格式
    find "$dirName" -type f -name "*.c" -exec grep -E '^[a-zA-Z0-9_*]+[[:space:]]+[a-zA-Z0-9_]+\([^)]*\)[[:space:]]*{' {} + | \
    sed -E 's/[[:space:]]*{/\n/g' | \
    awk 'NF > 0'
else
    echo "Error: 目录 $dirName 不存在!"
    exit 1
fi

脚本关键部分解释

  1. 安全的目录处理:把$1赋值给dirName时加了双引号,避免目录名包含空格或特殊字符时出问题。
  2. 提取函数定义:用grep -E配合正则匹配C函数的基本结构——行首的返回类型(支持指针类型)、空格、函数名、括号里的参数列表,最后跟着可能带空格的{。这个正则能覆盖大部分常规的C函数定义。
  3. 核心:在'{'处换行拆分:sed -E 's/[[:space:]]*{/\n/g'是解决你格式问题的关键。它会把所有"任意数量空白字符+{"的组合替换成换行符,这样原本挤在一行的多个函数会被拆分成单独的行,同时把{移到新行。如果你只想保留函数头(去掉{),可以把这个sed命令改成s/[[:space:]]*{//g,直接删掉{和前面的空格。
  4. 清理空行:awk 'NF > 0'会过滤掉替换过程中产生的空行,确保输出的每一行都是有效的函数定义头。

Bash中实现指定位置换行的通用方法

除了上面用sed的方式,还有几种常用的办法:

  • sed替换(最灵活):只要用sed 's/目标字符串/\n/g'就能把目标字符串换成换行。如果需要匹配复杂的模式,加-E启用扩展正则,比如匹配多个字符组合。
  • awk处理:用awk的gsub函数做全局替换,比如awk '{gsub(/[[:space:]]*{/, "\n"); print}',效果和sed一致,适合需要同时做其他文本处理的场景。
  • tr命令(简单场景):如果只是单个字符替换换行,比如把{换成换行,可以用tr '{' '\n',但tr不支持匹配多个字符(比如前面的空格),所以只适合简单需求。

另外要注意:在Bash中直接输出换行时,需要用$'...'语法识别转义字符,比如echo $'hello\nworld',但在sed、awk这类文本处理工具里,直接用\n就能表示换行。

内容的提问来源于stack exchange,提问作者NotThereYet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:34:46