如何在shell脚本中以单行输出grep?

时间:2012-05-23 17:24:14

标签: bash grep

这是一个脚本,它从文件的replace.txt中读取单词并显示每行中每个单词的输出,但我想在一行中显示所有输出。

#!/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 

“replacement.txt”文件的内容如下:

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

这个问题不适合我的要求,我只需要帮助将脚本的输出放在一行。

3 个答案:

答案 0 :(得分: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删除嵌入的换行符,并用一个空格替换多个空格和/或制表符的每个序列。

答案 1 :(得分: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或诸如此类的东西开始。)

答案 2 :(得分:1)

您也可以使用

awk 'BEGIN { OFS=": "; ORS=" "; } NF >= 2 { print $2; }'
切割后的管道中的