2012-02-18 87 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