从文本行获取bash中的所有变量

时间:2014-09-26 12:57:02

标签: regex bash variables sed

假设我有一个类似

的文本行
echo -e "$text is now set for ${items[$i]} and count is ${#items[@]} and this number is $((i+1))"

我需要获取所有变量(例如,使用sed),这样毕竟我的列表包含:$ text,$ {items [$ i]},$ i,$ {#items [@]},$ (第(i + 1))。

我正在编写具有一些复杂命令的脚本,在执行每个命令之前,它会提示给用户。所以,当我的脚本提示像#34; pacman -S $ {softtitles [$ i]}"你无法猜出这个命令实际上是做什么的。我只想添加下面这个命令中使用的变量列表及其值。所以我决定通过正则表达式和sed来做,但我不能正确地做到:/

UPD:它可以只是一个像echo这样的字符串" $ test是' ololo',$ {items [$ i]}是'今天',$ i是3",它根本不需要是列表,它可以包括任何临时变量和多行代码。它也不必是sed :)

SOLUTION:

echo $m | grep -oP '(?<!\[)\$[{(]?[^"\s\/\047.\\]+[})]?' | uniq > vars

$m - 包含多个bash变量的代码行,如"This is $string with ${some[$i]} variables"

uniq - 如果我们有多个相同变量的字符串,这将删除dublicates

vars - 用于保存在文本字符串中找到的所有变量的临时文件

下一段代码将以花哨的样式显示所有变量及其值:

if [ ! "`cat vars`" == "" ]; then
    while read -r p; do
        value=`eval echo $p`
        Style=`echo -e "$Style\n\t$Green$p = $value$Def"`
    done < vars
fi

$Style - 带有一些文本的预定义变量(命令的标题)

$Green$Def - 只有tput颜色设置(绿色 - &gt;文字 - &gt;默认)

Green=`tput setaf 2`
Def=`tput sgr0`

$p - 每个vars文件行(所有变量逐个)循环while read -r p循环。

3 个答案:

答案 0 :(得分:2)

您只需使用以下grep命令

即可
$ grep -oP '(?<!\[)(\$[^"\s]+)' file
$text
${items[$i]}
${#items[@]}
$((i+1))

答案 1 :(得分:1)

我不确定它的完美,但它对你有帮助

sed -r  's/(\$[^ "]+)/\n\1\n/g' filename | sed -n '/^\$/p'

说明:

(\$[^ "]+)    - Match the character $ followed by any charter until whitespace or double quote.
\n\1\n        - Matched word before and after put newlines ( so the variable present in separate line ) .
/^\$/p        - start with $ print the line like print variable 

答案 2 :(得分:1)

一些方法,我在包含

file上对每个方法进行了测试
echo -e "$text is now set for ${items[$i]} and count is ${#items[@]} and this number is $((i+1))"
  1. 的grep

    $ grep -oP '\$[^ "]*' file 
    $text
    ${items[$i]}
    ${#items[@]}
    $((i+1))
    
  2. perl的

    $ perl -ne '@f=(/\$[^ "]*/g); print "@f"' file 
    $text ${items[$i]} ${#items[@]} $((i+1))
    

    $ perl -ne '@f=(/\$[^ "]*/g); print join "\n",@f' file 
    $text
    ${items[$i]}
    ${#items[@]}
    $((i+1))
    
  3. 所有这些想法都是一样的。他们将收集以$开头的字符串列表以及尽可能多的后续字符,这些字符既不是空格也不是"