echo删除反斜杠字符

时间:2010-01-06 04:27:23

标签: bash shell

我正在尝试编写一个脚本来解析程序中的字段并将它们打印到标准输出。

输入文件数据是这样的

field1 field2

字段由制表符分隔

最初,我试图用AWK写它。

cat test.txt | while read line; do entity=`awk -F "\t" '{print $2}'`;echo $entity; done

这在命令行上运行良好。

但是当我尝试在shell程序中执行相同的操作时如下

while read line
do
        entity=`echo $line|awk -F \t '{print $2}'`
        echo $entity
done<"test.txt"

原因是echo $ line实际上将制表符打印为空格。我不能使用空格,因为字段实际上可以包含空格。

然后我尝试用cut编写。

while read line
do
        entity=`echo $line|cut -f5`
        echo $entity
done<"test.txt"

与echo相同的问题。

有人遇到类似的问题。您可以推荐我的任何解决方案。

感谢。 巴拉

2 个答案:

答案 0 :(得分:4)

如果你有一个带有制表符的变量,然后尝试回显变量:

line=$'f1\tf2\tf3'
echo ${line}

正在发生的是shell将选项卡视为参数分隔符并给出echo多个参数。 echo本身永远不会看到标签

如果要保留选项卡,则需要将该行视为单个参数。为了做到这一点并仍然扩展变量,您需要用双引号括起变量:

echo "${line}"

现在将发送一个包含选项卡的参数。

这意味着您应该像这样编写脚本:

while read line; do
    entity=$(echo "$line" | awk -F \t '{print $2}')
    echo $entity
done < test.txt

答案 1 :(得分:2)

信息有限,试试这个

while read -r line
do
        entity=$(echo "$line"|cut -f5)
        echo "$entity"
done<"test.txt"