2014-06-21 67 views
0

我試圖用sed替換幾個文件中的一些文本。替換多個文件擴展中的文本

例如:更換獅子在目錄及其子目錄中的所有TXT和MD文件。

到目前爲止,我從研究的最佳(非工作)嘗試我擁有的是:

find . -type *.txt | xargs sed -i '' 's/lion/hawk/' 

也試圖MD添加到TXT正則表達式 - * \(TXT | MD)給出。錯誤。

在此先感謝您的幫助。

回答

6

你想

find . -type f \(-name '*.txt' -o -name '*.md' \) -exec sed -i 's/lion/hawk/g' {} \; 

-o是一個邏輯或兩個-name謂詞。您也可以直接使用-exec而不是管道xargs(兩種工作)。

編輯更新報價& parens。

+0

+1但是用'+',而不是'\;'是因爲它更高效會一次發送多個文件到'sed',因此調用頻率較低。 – ooga

+1

請注意,'find -exec'從性能角度來看比'xargs'糟糕得多 - 當'xargs'將多個文件合併成單個'sed'調用時,它會爲每個找到的文件執行新的sed實例 – mvp

+0

@beer it將不適合我。它僅在'.md'中替換字符串'lion',但不在'.txt'文件中。 –

1

這應該爲你工作:

find . -type f -regextype egrep -regex ".*\.(txt|md)" -print0 | xargs -0 sed -i '' 's/lion/hawk/' 

您嘗試重要的區別:

  • 使用-type f限制搜索的文件只是
  • 使用-regextype於正則表達式引擎設置爲egrep(聰明比默認的emacs)
  • 使用-regex ".*\.(txt|md)"限制搜索文件txtmd擴展
  • 使用find -print0xargs -0處理空間中的文件名正常
0

試用一下下面的GNU find命令,

find . -name *.txt -o -name *.md -type f | xargs sed -i 's/lion/hawk/g' 

說明:

.        # Current directory 

-name *.md -o -name *.md  # Filenames end with .txt or .md 
-type f      # Only files. 
xargs sed -i 's/lion/hawk/g' # Replace lion with hawk on the founded files. 
+2

看來你是誤解'mindepth' 。 'find'的默認行爲是查看子目錄。 'mindepth'用於將操作限制在至少*深的深度。 – ooga

+0

@ooga感謝您的信息。 –