在Bash脚本中提取文本

时间:2012-02-19 17:20:27

标签: bash

我的头文件有很多#define语句,如:#define GPSVersion 0x000;

我想编写一个Bash脚本来将文本GPSVersion解压缩到一个文件中。但是我如何使用grep来做到这一点?我可以找到模式#define,但如何找到#define之后的文字?感谢。

5 个答案:

答案 0 :(得分:1)

echo "#define GPSVersion 0x000;" | awk '{print $2}'

cat file.h | grep ^'#define' | awk '{print $2}'

答案 1 :(得分:0)

试试这个使用Perl而不是grep的单行程序:

 perl -ne 'print "$1\n" if $_ =~ /#define \b(\w+?)\b.*/' < header.h

其中header.h是其中包含#define GPSVersion 0x000的文件。

答案 2 :(得分:0)

步骤:

  1. cat您的档案。 (样本中echo
  2. 过滤行,包括以#define
  3. 开头的行
  4. 获取第二个字段
  5. 命令:

    echo "#define GPSVersion 0x000;" | grep ^"#defin" | cut -d" " -f2
    

答案 3 :(得分:0)

$find /path/to/root/of/source/tree -name '*.h' |
  xargs grep '^#define.*GPSVersion' | cut -d' ' -f 2

<强>解释

find命令将打印源树中名称以.h结尾的所有文件 - 即所有头文件。

xargs命令将文件名传递给grep,这将打印以#define开头的所有行,后跟一个或多个字符,然后是GPSVersion

cut命令将打印第二个字段(文本为#define d),使用空格字符作为字段之间的分隔符。

答案 4 :(得分:0)

我认为这适合你:

grep -r '#define[[:space:]]*GPSVERSION[[:space:]].*' . | tr -s ' \t' '\t' | cut -f 3

grep -r:扫描指定目录和子目录中的所有文件 '#define[[:space:]]*GPSVERSION[[:space:]].*':是一个匹配所有#define指令的正则表达式,忽略whitespacing并仅考虑为其赋值的#defines。

Grep打印输出,然后输出传递给tr -s ' \t' '\t',将空格转换为适合cut

的空格

最后cut -f3仅打印所需的定义值。

它运行良好,除了:注释定义(// #define)和带有空格的文件名。