2013-02-03 67 views
1

我運行一個命令替換,在文件中爲換行符echo命令,並用tr命令不工作

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

此命令新生產線將

a,b,c 

a b c 

而不是將其轉換爲

a 
b 
c 

任何人都可以向我解釋爲什麼它正在發生併爲此解決?

+0

如果你正在尋找一個換行符替換「」在'字符集順序tr'是錯誤的。 ','應該是第一個參數,'\ n'是第二個參數。 – jitendra

回答

0

也許這

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

使用空格作爲分隔符有點不尋常。我想,沒有什麼問題,但是's /,\ n \ g''更常見。 –

1

這可能是你在找什麼。

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

首先,運行帶有輸入和輸出的命令重定向到同一文件是危險的。正如你所看到的那樣,它可能會發生作用,但是當你試圖讀取文件時,它可能會破壞文件的內容,具體取決於事件發生的順序。

爲了避免這個問題,讓我們簡化的命令:

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

所以tr命令本身如常運作。現在讓我們嘗試呼應輸出:

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

外殼執行該命令,並使用其作爲參數輸出到echo - 但輸出被分成由空格(包括換行符)分隔的單詞。

可避免這種情況,如果你用sh,bash或類似的殼,通過引用的說法:如果外殼

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

支持它(大多數人),你可以使用$(...)而比反引號:

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

我發現它更容易閱讀,因爲您可以輕鬆區分構造的開始和結束;它也可以嵌套。

最後,至少對於你在做什麼來說,使用echo沒有意義。以下是我想做到這一點:

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

這tranlates的file.txt內容,寫輸出到一個臨時文件($$是當前shell的進程ID,方便用於生成臨時文件名)。然後它將臨時文件重命名爲file.txt - 但只有當第一個命令成功時。這樣可以避免在出現錯誤的情況下破壞輸入文件。

+0

如果您打算倒戈,請解釋原因;也許我可以改進我的答案。 –