我試圖用sed替換幾個文件中的一些文本。替換多個文件擴展中的文本
例如:更換獅子與鷹在目錄及其子目錄中的所有TXT和MD文件。
到目前爲止,我從研究的最佳(非工作)嘗試我擁有的是:
find . -type *.txt | xargs sed -i '' 's/lion/hawk/'
也試圖MD添加到TXT正則表達式 - * \(TXT | MD)給出。錯誤。
在此先感謝您的幫助。
我試圖用sed替換幾個文件中的一些文本。替換多個文件擴展中的文本
例如:更換獅子與鷹在目錄及其子目錄中的所有TXT和MD文件。
到目前爲止,我從研究的最佳(非工作)嘗試我擁有的是:
find . -type *.txt | xargs sed -i '' 's/lion/hawk/'
也試圖MD添加到TXT正則表達式 - * \(TXT | MD)給出。錯誤。
在此先感謝您的幫助。
你想
find . -type f \(-name '*.txt' -o -name '*.md' \) -exec sed -i 's/lion/hawk/g' {} \;
的-o
是一個邏輯或兩個-name
謂詞。您也可以直接使用-exec
而不是管道xargs
(兩種工作)。
編輯更新報價& parens。
這應該爲你工作:
find . -type f -regextype egrep -regex ".*\.(txt|md)" -print0 | xargs -0 sed -i '' 's/lion/hawk/'
您嘗試重要的區別:
-type f
限制搜索的文件只是-regextype
於正則表達式引擎設置爲egrep
(聰明比默認的emacs)-regex ".*\.(txt|md)"
限制搜索文件txt
或md
擴展find -print0
和xargs -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.
看來你是誤解'mindepth' 。 'find'的默認行爲是查看子目錄。 'mindepth'用於將操作限制在至少*深的深度。 – ooga
@ooga感謝您的信息。 –
+1但是用'+',而不是'\;'是因爲它更高效會一次發送多個文件到'sed',因此調用頻率較低。 – ooga
請注意,'find -exec'從性能角度來看比'xargs'糟糕得多 - 當'xargs'將多個文件合併成單個'sed'調用時,它會爲每個找到的文件執行新的sed實例 – mvp
@beer it將不適合我。它僅在'.md'中替換字符串'lion',但不在'.txt'文件中。 –