假设我有一个类似
的文本行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 :)
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
循环。
答案 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))"
的grep
$ grep -oP '\$[^ "]*' file
$text
${items[$i]}
${#items[@]}
$((i+1))
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))
所有这些想法都是一样的。他们将收集以$
开头的字符串列表以及尽可能多的后续字符,这些字符既不是空格也不是"
。