2009-12-12 73 views
1

我得到基于此代码的标题的空间分隔的列表:问题与壳循环

TITLES=`awk -F'|' '{print $1}' titles.txt | cut -d'=' -f2 | sort 

然后我使用该列表中的for循环打印出结果:

for T in $TITLES 
do 
    echo "$T" 
done 

问题是,当一个标题有多个单词并且单词之间用空格分隔时,我的for循环会将它们作为单独的东西打印出来。

我试着在每个标题中使用sed添加两个qoutes,但是这只是导致循环打印每个单词的双引号而不是两个单词的标题。

我该如何解决这个问题?

+0

请你向我们提供TITLES.TXT几行?我理解这个问题有一些困难。当标题用空格分隔,并且某些标题多于一个单词时,你如何区分标题和单词? – 2009-12-12 22:02:52

回答

1

一种方式做,这是设置IFS:

IFS=' 
' 
for T in $(awk -F'|' '{print $1}' titles.txt | cut -d'=' -f2 | sort) 
do 
    echo "$T" 
done 

这台IFS只是换行(有开放之间的换行符并关闭单引号)。

我知道这在bash中有效,但我不确定它是如何可移植到其他shell的。

如果你这样做,你几乎可以肯定地想要在完成循环后将IFS设置回旧值。

+0

这工作!好的,如何在循环完成后将IFS设置回旧值? – goe 2009-12-12 22:04:14

+1

它通常是空格标签和换行符,因此您可以明确设置它,也可以在循环前将旧值存储在临时变量中,然后在循环后从临时变量中恢复IFS的值。 – 2009-12-12 22:11:47

+0

这是个好主意,谢谢! – goe 2009-12-12 22:15:05

2

你试过在$ TITLES附近加引号吗?

TITLES=`awk -F'|' '{print $1}' titles.txt | cut -d'=' -f2 | sort` 
for T in "$TITLES" 
do 
    echo "$T" 
done 

或者你可以使用,而:

awk -F'|' '{print $1}' titles.txt | cut -d'=' -f2 | sort | while read T 
do 
    echo "$T" 
done 
+0

此代码给我“错误500” – goe 2009-12-12 21:52:07

+0

对不起,我错过了一个。再试一次。 – 2009-12-12 21:53:12

+0

这可能会在unix控制台中工作,但我需要在脚本中运行而不是回声,我最终会在该循环内部有一个变量并在循环外部使用它。这种情况现在对我无效。 – goe 2009-12-12 21:59:24

1

你可以使用无壳外部工具

while IFS="|" read -r a b 
do 
    IFS="=" 
    set -- $a 
    T=$2 
    echo "T is $T" 
    unset IFS 
done <"file"