2012-02-18 89 views
0

我有两个字符串,我想与空间分裂和两个两个地使用它们:如何在shell中拆分字符串?

namespaces="Calc Fs" 
files="calc.hpp fs.hpp" 

例如,我想用这样的:command -q namespace[i] -l files[j]

我在小白Bourne Shell。

+0

在Python,这将是['zip'](http://docs.python.org/library/functions.html #zip)功能。 [bash中的Python zip()行为?](http://stackoverflow.com/questions/6145540/python-zip-behavior-in-bash)可能会有所帮助。 – 2012-02-18 22:22:48

回答

2
echo "hello world" | awk '{split($0, array, " ")} END{print array[2]}' 

是你如何分割一个简单的字符串。如果你想要做的是循环遍历分裂的两个字符串的组合,那么你想是这样的

+0

我能得到数组的大小? – softghost 2012-02-19 00:16:48

+0

回声“hello world”| awk'{split($ 0,array,“”)} END {print length(array)}' – 2012-02-19 00:19:12

+0

上述命令不起作用。 – softghost 2012-02-19 13:00:19

1

for namespace in $namespaces 
do 
    for file in $files 
    do 
     command -q $namespace -l $file 
    done 
done 

编辑: 或扩大被张贴,你可以在AWK解决方案也只是做:

echo $foo | awk '{print $'$i'}' 

编辑2:

免责声明:我不不自称是一个你是awk的专家,所以在这个解释中可能会有一些小错误。

基本上上面的代码片段是将$foo的内容输入到awk的标准输入中。 Awk从行标准中逐行读取,根据字段分隔符将每行分隔为字段,缺省情况下是任意数量的空格。 Awk执行它作为参数给出的程序。在这种情况下,shell将'{ print $'$1' }'扩展为{ print $1 },它只是告诉awk打印其输入的每一行的字段编号1。

如果您想要了解更多信息,我认为this blog post在描述基础知识(以及sed和grep的基础知识)方面做得非常好,如果您在开始时跳过理论性较强的东西(除非您到那种东西)。

+0

你能告诉我关于** awk **的更多信息吗? – softghost 2012-02-18 23:48:20

+0

我不是awk专家,但我在我的回答中添加了一个解释 – 2012-02-19 00:08:17

3

将它放到一个数组,像这样:

#!/bin/bash 

namespaces="Calc Fs" 
files="calc.hpp fs.hpp" 
i=1 
j=0 

name_arr=($namespaces) 
file_arr=($files) 

command -q "${name_arr[i]}" -l "${file_arr[j]}" 
+0

我有一个问题:bash和sh之间有什么区别,因为#!/ bin/sh无法解析name_arr =($ namespaces)。 – softghost 2012-02-18 23:46:17

+0

@softghost'sh'是一个符合POSIX标准的shell(尽管SunOS的版本已经过时了)。另一方面,'bash'是一个具有更多功能的shell,其中一个包含数组。 – SiegeX 2012-02-19 01:43:46

1

我想找到一个办法做到这一点不阵列,这就是:

paste -d " " <(tr " " "\n" <<< $namespaces) <(tr " " "\n" <<< $files) | 
    while read namespace file; do 
    command -q $namespace -l $file 
    done 

两个特殊用途的位置:进程替换( <(...))和这里字符串(<<<)。这里字符串是echo $namespaces | tr " " "\n"的快捷方式。流程替换是fifo创建的捷径,它允许使用命令的输出而不是文件运行paste

1

如果您正在使用的zsh 可以很容易的:

files="calc.hpp fs.hpp" 

# all elements 
print -l ${(s/ /)files} 

# just the first one 
echo ${${(s/ /)files}[1]} # just the first one