grep用于脚本引用的变量列表?



我有一些脚本使用各种变量,我想grep(从FreeBSD上的bash中)每个脚本使用的变量列表。这些是而不是shell脚本,但是引用变量的语法与bash中使用的语法相似。具体来说,对变量的引用可以像这样:

  • $ X,或者
  • $ {X}

和变量名("X"在这种情况下)可以包括字母数字和下划线。在这一点上,我想明确地指出,我认为bash本身可能有一组更复杂的方法来引用变量,但如果是这样,我不关心这个问题的目的。

我想找到在给定文件中引用的所有变量名-只是名称,而不是整行。比如像awesomegrepcmd filename | sort | uniq这样的形式

请注意,一行中可能会引用多个不同的变量。

我一直在与正则表达式作斗争,并通过很大程度上无知的黑暗尝试逃避规则(例如"好吧,也许我需要在这里放两个反斜杠,但只有一个")现在有一段时间了,谷歌搜索试图找到其他人谁做过这种事情,但到目前为止还无法完成我想要的。如何做到这一点?谢谢。

编辑:示例:假设一个文件的内容是这样的(只是伪代码,不是bash之类的):

SPECIFICS={ "be born", "die", "plant", "reap", "kill", "heal", "laugh", "weep" }
CHORUS_PREFIX="To every thing"
CHORUS_INFIX="there is a season"
CHORUS_SUFFIX="and a time to every purpose under heaven."
CHORUS_SEPARATOR=", turn, turn, turn, "
CHORUS = $CHORUS_PREFIX + ${CHORUS_SEPARATOR} + $CHORUS_INFIX + $CHORUS_SEPARATOR + ${CHORUS_SUFFIX}
SPECIFIC_PREFIX="A time to "
UNUSED=${SOMETHING}
echo $CHORUS
foreach SPECIFIC in $SPECIFICS {
echo $SPECIFIC_PREFIX + " " + ${SPECIFIC}
}
echo ${CHORUS}

那么我想要的输出将是:

CHORUS
CHORUS_INFIX
CHORUS_PREFIX
CHORUS_SEPARATOR
CHORUS_SUFFIX
SOMETHING
SPECIFIC
SPECIFIC_PREFIX
SPECIFICS

有几点需要注意:

  1. ${CHORUS}和$CHORUS(例如)都指向同一个变量,名为CHORUS
  2. 未使用的变量不在输出中,因为它实际上没有在脚本中使用(尽管已经在其中定义)
  3. SOMETHING变量,仅使用来定义未使用的unused变量,在输出中是,因为它使用
  4. 各种CHORUS_xxx变量只在定义CHORUS变量的一行中使用,但它们出现在输出中。

使用扩展正则表达式:

me@lappy386:/tmp$ grep -Eoi '$({[a-z0-9_]+}|[a-z0-9_]+)' 
/tmp/example |tr -d '{}$'|sort|uniq
CHORUS
CHORUS_INFIX
CHORUS_PREFIX
CHORUS_SEPARATOR
CHORUS_SUFFIX
SOMETHING
SPECIFIC
SPECIFIC_PREFIX
SPECIFICS

使用grep和sed

grep -oE '$[A-Za-z_]+|${[A-Za-z_]+}' inputFile|  sed -r 's/[${}]//g' | sort | uniq

的例子:

$ grep -oE '$[A-Za-z_]+|${[A-Za-z_]+}' inputFile |  sed -r 's/[${}]//g' | sort | uniq
CHORUS
CHORUS_INFIX
CHORUS_PREFIX
CHORUS_SEPARATOR
CHORUS_SUFFIX
SOMETHING
SPECIFIC
SPECIFICS
SPECIFIC_PREFIX

相关内容

  • 没有找到相关文章