的UNIX命令來查找文件名爲find
,不grep
。當他們補充說-r
選項的時候,GNU的人大肆宣揚。爲了找到&替換字符串中的正則表達式是:
tmp=/usr/tmp/tmp$$
trap 'rm -f "$tmp"; exit' 0
find . -type f -print |
while IFS= read -r file
do
sed 's/OldRegexp/NewString/g' "$file" > "$tmp" &&
mv "$tmp" "$file"
done
與唯一需要注意的是它不會工作,如果你的文件名包含換行符 - 如果他們這樣做,然後要麼將其重命名(最好)還是看find -print0
和xargs -0
。
如果您願意,您可以通過使用sed -i
明確指定tmp文件。
現在,如果你希望哪些文件被改變的列表,你可以這樣做:
tmp=/usr/tmp/tmp$$
trap 'rm -f "$tmp"; exit' 0
> logfile
find . -type f -print |
while IFS= read -r file
do
sed 's/OldRegexp/NewString/g' "$file" > "$tmp"
if [ $? -eq 0 -a diff -q "$tmp" "$file" ]
then
printf "%s\n" "$file" >> logfile
mv "$tmp" "$file"
fi
done
如果你決定使用sed -i
(個人而言,我不會),然後創建TMP副本在sed之前的文件並將其用於diff。
如何在$(grep -ril'OldString')中存放文件? do sed -i's .... g'$ file;完成'? – fedorqui
嗨@fedorqui,你介意指導這個答案嗎? – Barney
要清楚 - 「OldString」不是一個字符串,它是一個正則表達式。把它想象成一串可以/會咬你。 –