3

这是我的代码

michal@argon:~$ cat test.txt 
1
  2
    3
      4
        5
michal@argon:~$ cat test.txt | while read line;do echo $line;done > new.txt
michal@argon:~$ cat new.txt
1
2
3
4
5

我不知道为什么命令echo $line过滤了空格字符,我希望 test.txt 和 new.txt 完全一样。

请帮忙,谢谢。

4

3 回答 3

6

您的代码有几个问题。

  1. $parameter之外" "。不。
  2. read用于$IFS将输入行拆分为单词,您必须禁用它。
  3. UUOC

总结一下:

 while IFS= read line ; do echo "$line" ; done < test.txt > new.txt
于 2013-05-22T20:23:02.050 回答
2

虽然提供的答案解决了您手头的任务,但它们没有解释原因bash并且echo“忘记”打印字符串中的空格。让我们先做一个小例子来说明问题。我只是在我的 shell 中运行命令,这个不需要真正的脚本:

mogul@linuxine:~$ echo      something
something
mogul@linuxine:~$ echo something
something

两个 echo 命令都在行的开头打印一些东西,即使第一个在echosomething之间有足够的空间。现在引用:

mogul@linuxine:~$ echo "     something"
     something

注意,这里 echo 在某事之前打印了前导空格

如果我们将字符串填充到变量中,它的工作方式完全相同:

mogul@linuxine:~$ str="     something"
mogul@linuxine:~$ echo $str
something
mogul@linuxine:~$ echo "$str"
     something

为什么?

因为shell(在您的情况下为bash)会在将命令传递给子进程之前删除命令参数之间的空格。通过引用字符串,我们告诉 bash 我们的意思是字面意思,它不应该与字符串混淆。

如果您要处理具有有趣名称的文件,例如“这是一个 name.txt 中有空格的文件”,这些知识将变得非常有价值

于 2013-05-22T21:18:54.170 回答
1

试试这个 -

$ oldIFS="$IFS"; IFS=""; while read line;do echo $line >> new.txt ;done < test.txt; IFS="$oldIFS"

$ cat new.txt
1
  2
      3
            4
                    5
于 2013-05-22T20:03:52.237 回答