【问题标题】:Echo changes my tabs to spacesEcho 将我的标签更改为空格
【发布时间】:2011-07-04 22:02:53
【问题描述】:

我从网上获取以下结构作为如何从 BASH 中读取文件的基本示例:

cat inputfile.txt | while read line; do echo $line; done

不过,我的 inputfile.txt 是制表符分隔的,并且上述命令中的行是空格分隔的。

这导致我在实际应用中出现问题,当然比上面的要复杂:我想取行,根据它生成一些新的东西,然后将原始行加上新的东西作为额外的输出字段。如果没有一堆cut -d ' 'sed -e 's/ /\t/g'(无论如何对于包含空格的制表符分隔的数据来说,这将是不安全的),管道将变得足够复杂。

我查看了 IFS 解决方案,但在这种情况下它们似乎没有帮助。我想要的是一个OFS……除了我在回声中,而不是awk!我认为如果我能得到回声来吐出我给它的东西,逐字逐句,我会处于良好状态。有什么想法吗?谢谢!

【问题讨论】:

  • 你通常不需要使用 cat 作为管道的一部分,只需直接从文件中重定向下一个命令的标准输入:while read line; do echo $line; done < inputfile.txt

标签: bash delimiter


【解决方案1】:

试试:

cat inputfile.txt | while read line; do echo "$line"; done

改为。

换句话说,不是read替换标签,而是echo

查看以下文字记录(使用<<tab>> 标签所在的位置):

pax$ echo 'hello<<tab>>there' | while read line ; do echo $line ; done
hello there

pax$ echo 'hello<<tab>>there' | while read line ; do echo "$line" ; done
hello<<tab>>there

【讨论】:

  • 好伤心;有那么容易吗?谢谢!无论如何都要加上引号的好习惯。
  • 更换标签是(ba)sh和echo之间的阴谋。 echo $line 将行拆分为单词,然后将其全局化并分别传递给 echo,然后用空格将它们连接起来。 echo "$line" 按原样传递字符串。相比之下,DOS/Windows echo %line% 没有做这些事情(实际上甚至直接回显引号字符)。
  • BTW read 将去除前导和尾随空格,因此如果要保留前导/尾随制表符,请使用 ... while IFS= read line ...(请注意,由于分配给 IFS 是读取命令的前缀,它只适用于此,之后不必重置)。
  • 感谢 Gordon,您的评论对我帮助很大。
猜你喜欢
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 2023-03-30
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多