在shell脚本中提取引号中的单词

时间:2010-10-29 11:19:01

标签: bash shell awk

我正在制作一个shell脚本,它将自动化Arch Linux AUR packages的安装过程。我需要列出软件包的所有依赖项(以检查它们是否已安装),它们在安装脚本中显示如下:

depends=('sdl' 'libvorbis' 'openal')

我能想出的最简单的方法(或唯一的想法)是这样的:

grep "depends" PKGBUILD | awk -F"'" '{print $2 "\n" $4 "\n" $6;}'

但依赖计数因包而异。那么,如果字数变化,我如何输出引号中的名字?

提前致谢,

-skazhy

5 个答案:

答案 0 :(得分:4)

如果depends只是一行,你可以尝试的一件事是评估bash本身的行...这将导致一个名为“depends”的数组,它包含所有的值。看起来很棘手,但不是动态语言:

depend_line=`grep depends $PKGBUILD`
eval "${depend_line}"
echo ${depend[0]} # Will print sdl in your example

答案 1 :(得分:3)

您可以使用eval来避免使用declare或获取临时文件的安全问题:

declare -a "$(grep "depends" PKGBUILD)"

这将创建一个名为“depends”的数组,其中包含基于示例数据的“sdl”,“libvorbis”和“openal”。

答案 2 :(得分:1)

尝试使用此尺寸:

grep "depends" PKGBUILD > /tmp/depends
. /tmp/depends

echo ${depends[@]}
嘿,看,那是一个阵列?是的。

for d in "${depends[@]}" ; do
    printf '"%s"' "$d"
done

注意:在实际脚本中,您需要更加谨慎地命名临时文件。

答案 3 :(得分:0)

您可以执行以下操作:

grep "depends" PKGBUILD | perl -e "while(<>){print \"\$1\\n\" while m/'.{-}'/g;}"

答案 4 :(得分:0)

awk -F"'" '{for(i=2;i<=NF;i+=2) print($i)}'