【问题标题】:Bash: weird echo behavior [closed]Bash:奇怪的回声行为[关闭]
【发布时间】:2013-06-14 12:53:29
【问题描述】:

我正在尝试为程序自动生成的日志制作解析器,而生成 csv 的解析器部分开始出现奇怪的行为。 最疯狂的部分是这个:

echo "$COMMAND_3_NAME,,$TIME_1_START,$TIME_1_END,$DIFF_1,,$TIME_2_START,$TIME_2_END,$DIFF_2,,$TIME_3_START,$TIME_3_END,$DIFF_3,,$TIME_USR_START,$TIME_USR_END,$DIFF_USR" >> $OUT_NAME

这一行正在生成以下输出:

Command_3,,458.7
484.0,483.9
507.5,-458.7
967.9
507.5,,271.8
271.8,271.8
271.8,-271.8
543.6
271.8,,,,,,967.8
967.8,967.8
967.8,-967.8
1935.6
967.8

其中不应该有任何 \n,因为我在打印的每个变量中都执行了“sed”s/\n//g”。

【问题讨论】:

  • 您的 sed 版本是否将 '\n' 转换为换行符,还是将其视为两个文字字符 '\' 和 'n'?
  • 最好还是试试tr -d '\n'
  • 我没有看到每行末尾的“,”。您在帖子中省略了它们,或者回声忽略了它们?
  • 不应该有任何新行。我发布的是程序的确切输出。

标签: bash csv echo


【解决方案1】:

对于输入

foo
bar

sed 在字符串foobar 上运行表达式,而不是foo\nbar\n

sed -e 's/\n//g' 因此不会替换任何换行符。

要删除换行符,您可以通过tr -d '\n' 管道或使用bash 变量扩展"${myvariable//$'\n'/}"

【讨论】:

  • 这不是问题。问题是 echo 将 ',' 替换为 '\n'。我在问题发生后添加了 sed 行。
  • 它不会用\n 替换,,因为有几个,s 周围没有换行符。更有可能的是,变量本身包含换行符。 printf "%q\n" "$TIME_1_START" 可能会显示 $'458.7\n484.0'。要删除它们,请参阅答案。
  • 那么 ,s 去哪儿了?再次读取 echo 行并计算 ,s。
  • 两者都有16个逗号。
猜你喜欢
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 2017-01-02
  • 1970-01-01
相关资源
最近更新 更多