Echo命令和带有tr命令的新行无效

时间:2013-02-03 19:17:50

标签: shell tr

我正在运行命令将文件中的,替换为换行符

echo `tr ',' '\n' < file.txt` > file.txt

此命令正在转换

a,b,c

a b c 

而不是将其转换为

a
b
c

任何人都可以向我解释为什么会发生这种情况并为此解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

首先,运行一个输入和输出重定向到同一文件的命令是危险的。正如您所见,它可能正常工作,但是当您尝试阅读文件时,它可能会破坏文件的内容,具体取决于事件发生的顺序。

为了避免这个问题,让我们简化命令:

$ cat file.txt
a,b,c
$ tr , '\n' < file.txt 
a
b
c

因此tr命令本身正如您所期望的那样工作。现在让我们尝试回显输出:

$ echo `tr , '\n' < file.txt`
a b c

shell执行命令并将其输出用作echo的参数 - 但输出被拆分为由空格分隔的单词(包括换行符)。

如果你使用sh,bash或类似的shell,你可以通过引用参数来避免这种情况:

$ echo "`tr , '\n' < file.txt`"
a
b
c

如果shell支持它(大部分都支持),你可以使用$(...)而不是反引号:

$ echo "$(tr , '\n' < file.txt)"
a
b
c

我觉得它更容易阅读,因为你可以很容易地区分构造的开头和结尾;它也可以嵌套。

最后,至少对于你正在做的事情,使用echo毫无意义。我就是这样做的:

tr , '\n' < file.txt > $$ && mv $$ file.txt

这会转换file.txt的内容,将输出写入临时文件($$是当前shell的进程ID,方便生成临时文件名)。然后它将临时文件重命名为file.txt - 但仅在第一个命令成功时才会重命名。如果出现问题,可以避免破坏输入文件。

答案 1 :(得分:1)

这可能就是你要找的东西。

tr ',' '\n' < file.txt > tempFile.txt  
mv tempFile.txt file.txt

答案 2 :(得分:0)

也许这个

sed -i 's , \n g' file.txt

答案 3 :(得分:0)

cat file.txt | tr "," "\n"

然后可以重定向到您的文件(通过Keith in his comment above提到的中间tmp文件)