2014-05-22 74 views
4

我有一個小bash腳本,將一個目錄中的所有文件降價,並把它們合併成一個像這樣的:Bash:連接多個文件並在每個文件之間添加「 newline」?

for f in *.md; do (cat "${f}";) >> output.md; done 

它運作良好。現在我想在每個文檔之間添加字符串「\ newline」,如下所示:

for f in *.md; do (cat "${f}";) + "\newline" >> output.md; done 

我該怎麼做?上面的代碼顯然不起作用。

回答

8

如果你想在文字字符串"\newline",試試這個:

for f in *.md; do cat "$f"; echo "\newline"; done > output.md 

這假定output.md不存在。如果它(和你想在最終輸出的內容),你可以這樣做:

for f in *.md; do cat "$f"; echo "\newline"; done > out && mv out output.md 

這可以防止錯誤cat: output.md: input file is output file

如果您想要覆蓋它,您應該在開始之前使用rm

4

你可以這樣做:

for f in *.md; do cat "${f}"; echo; done > output.md 

您可以添加echo命令添加一個換行符。爲了提高性能,我建議在for循環外面寫入>,以防止在每次迭代時讀寫文件。

0

這裏有一個有趣的可能性,使用ed,標準編輯:

ed -s < <(
    for f in *.md; do 
     [[ $f = output.md ]] && continue 
     printf '%s\n' "r $f" a '\newline' . 
    done 
    printf '%s\n' "w output.md" "q" 
) 

(我已經插入一行排除插入的文件output.md)。

對於每個文件:

  • r $fred插入文件命令,
  • aed用於編輯的當前行之後開始換行,
  • \newline:很好,我們是插入模式,所以ed只是插入這個,
  • .:停止插入模式。

最後,我們w儀式緩衝區文件output.mdq UIT。

相關問題