2012-05-23 86 views
5

这是一个脚本,它从文件replaced.txt中读取单词,并在每行中显示每个单词的输出,但是我想在一行中显示所有输出。 “replaced.txt”文件如何在shell脚本中获得单行grep的输出?

 
#!/bin/sh 
echo 
echo "Enter the word to be translated" 
read a 
IFS=" "  # Set the field separator 
set $a  # Breaks the string into $1, $2, ... 
for a # a for loop by default loop through $1, $2, ... 
    do 
    { 
    b= grep "$a" replaced.txt | cut -f 2 -d" " 
    } 
    done 

内容下面给出:

 
hllo HELLO 
m AM 
rshbh RISHABH 
jn JAIN 
hw HOW 
ws WAS 
ur YOUR 
dy DAY 

这个问题不能适当我问,我只需要帮助来把脚本的输出一条线。

+0

您的脚本不完整。 echo(或'printf')语句在哪里?花括号和'do' /'done'是多余的。你只需要一个或另一个。 –

回答

9

你的整个脚本可以被替换为:

#!/bin/bash 
echo 
read -r -p "Enter the words to be translated: " a 
echo $(printf "%s\n" $a | grep -Ff - replaced.txt | cut -f 2 -d ' ') 

不需要循环。

带有不带引号的参数的echo删除嵌入的换行符,并用一个空格替换多个空格和/或制表符的每个序列。

2

从命令输出中删除尾随换行符的一种简单而不简单的方法是将其包装在printf %s "$(...) "中。也就是说,你可以改变这一点:

b= grep "$a" replaced.txt | cut -f 2 -d" " 

这样:

printf %s "$(grep "$a" replaced.txt | cut -f 2 -d" ") " 

和循环完成后添加echo命令。

$(...)表示法设置了一个“命令替换”:命令grep "$a" replaced.txt | cut -f 2 -d" "在子shell中运行,其输出减去任何尾随的换行符被替换为参数列表。因此,例如,如果该命令输出DAY,那么上述等效于此:

printf %s "DAY " 

(该printf %s ...符号相当于echo -n ... —它输出一个字符串不添加尾随换行符—不同之处在于它的行为是更便携一致,并且它不会胡作非为,如果你想打印字符串恰好开始-n-e或诸如此类的东西)

1

您还可以使用

awk 'BEGIN { OFS=": "; ORS=" "; } NF >= 2 { print $2; }' 

在管道切断后。