2012-05-23 82 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; }' 

在管道切斷後。