【问题标题】:Why in shell script output file get written as single line?为什么在 shell 脚本输出文件中写成单行?
【发布时间】:2014-12-07 07:53:12
【问题描述】:

输入文件:ankit.txt 带有标题日期和尾部计数

H2014-12-02
12ASDF23 FGHJ HJKL
123ASD23 FGHJ HJKL
123ASD23 FGHJ HJKL
123ASD23 FGHJ HJKL
T000004

我想要没有标题和尾部的数据。

命令:

head -n -1 ankit.txt | tail -n +2 >output

在shell脚本中

echo `head -n -1 ankit.txt | tail -n +2` >output

输入:

12ASDF23 FGHJ HJKL 123ASD23 FGHJ HJKL 123ASD23 FGHJ HJKL 123ASD23 FGHJ HJKL

单行输出...(我不想要的

我尝试在 shell 脚本中简单地给出 cat 命令,但显示的数据也是单行

我在 shell 脚本中尝试了没有回显的相同命令。

即使我保留了 1 个命令来通过 shell 脚本显示输出:

cat ankit.txt

输出是单行。 wc -l 给出了正确的计数,但一个简单的 cp 也给出了单行输出。

cp ankit.txt output

【问题讨论】:

  • 你不需要echo
  • @Ankit:正如 Karoly Horvath 所提到的,在你的脚本中使用不带echo `` 的命令。
  • 您是 FTP 文件还是在运行上述所有文件的系统上创建文件?
  • 没有回声和`` .. 谢谢!!!
  • 那么也许将合适的答案标记为已接受,这样这个问题就不再出现未解决?如果您不喜欢现有答案,请发布并接受您自己的答案。

标签: bash shell


【解决方案1】:

使用

echo `command`

不仅浪费,它还会在将command 的输出传递给echo 之前对输出进行空格拆分和全局扩展。通常你只是想要

command

或者,如果您坚持进行流程替换,并希望保留其输出,请将其放在双引号中:

echo "$(command)"

(请注意切换到现代的、推荐的进程替换语法。)

但是说真的,你为什么要这样?如果真的有,那不是更好吗

echo "$(echo "$(echo "$(echo "$(echo ...

【讨论】:

    【解决方案2】:

    看起来你有 Windows 行尾。你有两个选择。预处理您的输入文件,使其以 UNIX 结尾:

    dos2unix ankit.txt
    

    或者将其作为管道的一部分:

    dos2unix < ankit.txt | head -n -1 | tail -n +2 > output
    

    注意dos2unix 有两种模式。在第一种情况下,它将获取输入文件并使用 UNIX 行结尾重写它(这是预处理的理想选择)。其次,它将从标准输入读取并将新输出写入标准输出(这对于管道来说是理想的)。

    【讨论】:

    • 如果 CRLF 行尾 (\r\n) 是问题所在,则症状会有所不同。例如,试试echo $(printf 'line 1\r\nline 2\r\n')
    猜你喜欢
    • 2015-01-24
    • 2015-05-21
    • 1970-01-01
    • 2021-11-09
    • 2020-07-15
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多