我運行一個命令替換,
在文件中爲換行符echo命令,並用tr命令不工作
echo `tr ',' '\n' < file.txt` > file.txt
此命令新生產線將
a,b,c
到
a b c
而不是將其轉換爲
a
b
c
任何人都可以向我解釋爲什麼它正在發生併爲此解決?
我運行一個命令替換,
在文件中爲換行符echo命令,並用tr命令不工作
echo `tr ',' '\n' < file.txt` > file.txt
此命令新生產線將
a,b,c
到
a b c
而不是將其轉換爲
a
b
c
任何人都可以向我解釋爲什麼它正在發生併爲此解決?
也許這
sed -i 's , \n g' file.txt
使用空格作爲分隔符有點不尋常。我想,沒有什麼問題,但是's /,\ n \ g''更常見。 –
這可能是你在找什麼。
tr ',' '\n' <file.txt> tempFile.txt
mv tempFile.txt file.txt
首先,運行帶有輸入和輸出的命令重定向到同一文件是危險的。正如你所看到的那樣,它可能會發生作用,但是當你試圖讀取文件時,它可能會破壞文件的內容,具體取決於事件發生的順序。
爲了避免這個問題,讓我們簡化的命令:
$ 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
- 但只有當第一個命令成功時。這樣可以避免在出現錯誤的情況下破壞輸入文件。
如果您打算倒戈,請解釋原因;也許我可以改進我的答案。 –
cat file.txt | tr "," "\n"
然後可以重定向到文件(通過由Keith in his comment above提到中間tmp文件)
如果你正在尋找一個換行符替換「」在'字符集順序tr'是錯誤的。 ','應該是第一個參數,'\ n'是第二個參數。 – jitendra