【问题标题】:Sed/Grep - Filter Out ContentSed/Grep - 过滤掉内容
【发布时间】:2011-12-03 23:53:09
【问题描述】:

鉴于我有这样的事情:

int val; struct node *mhm;
int val; struct node *next;

我想使用 sed、awk 或 grep 提取每一行的内容,以便它们读取:

init->val = val; init->mhm = mhm;
init->val = val; init->next = next;

grep -o 在新行上输出每个单独的结果,但我需要保留行结构(每组变量引用一个单独的东西)。

我目前使用的是 gnu sed 命令,但我只想输出替换后的字符串:

sed -re 's/([A-Za-z0-9_]*);/init->\1 = \1;/g'

上面的 sed 命令输出:

int init->val = val; struct node *init->mhm = mhm;
int init->val = val; struct node *init->next = next;

即使使用非贪婪修饰符,我也无法获得完整的正则表达式语句来成功选择每一行中的每个变量名。

【问题讨论】:

    标签: regex unix sed


    【解决方案1】:

    这适用于您的样本集(对您的解决方案稍作改动):

    sed -re 's/[^;]* [*]?([A-Za-z0-9_]+) *;/init->\1 = \1; /g'
    

    【讨论】:

      【解决方案2】:

      除非您解析语言,否则每一行中都没有变量名。

      话虽如此,只是随机文本,这是:
      s/([^\S\n]*)[^;\n]+?(\w+)\s*;/\1init->\2 = \2;/g
      应该这样做。

      【讨论】:

        【解决方案3】:

        试试这个

        awk '{for(i=1;i<=NF;i++) if($i~/;/){ gsub(/\*/,"",$i);a=gensub(/(\w*);/, "init->\\1 = \\1; ","g",$i);printf a;}print ""}' yourFile
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-04-23
          • 1970-01-01
          • 2014-05-18
          • 1970-01-01
          • 1970-01-01
          • 2013-12-11
          • 1970-01-01
          相关资源
          最近更新 更多