Find and replace with sed in directory and sub directories
我运行此命令,在我的站点根目录下的所有文件中查找所有出现的"apple"并将其替换为"orange":
1
| find ./ -exec sed -i 's/apple/orange/g' {} \; |
但它不经过子目录。
这个命令有什么问题?
下面是find ./的一些输出行:
1 2 3 4 5 6 7
| ./index.php
./header.php
./fpd
./fpd/font
./fpd/font/desktop.ini
./fpd/font/courier.php
./fpd/font/symbol.php |
- 你能运行find ./并发布一些样本输出吗?还有目录结构。编辑:谢谢!
- 嗯,你的发现是正确的,适合我和细分市场。
- 你怎么知道它不处理子目录?
- 因为它会出现以下错误:sed:无法编辑。/fpd:非常规文件sed:无法编辑。/fpd/font:非常规文件sed:无法编辑。/fpd/font/makefont:非常规文件sed:无法编辑。/fpd/font/makefont:非常规文件
- 哦。。。我为苹果喝醉了,却什么也没找到。他们都被替换了。谢谢。你睁开了我的眼睛!!!!
- awk/sed的可能副本:如何递归查找/替换字符串?
- 如果使用zsh,可以使用例如src/**/.js。
- 你可以在这里找到答案:stackoverflow.com/a/49364510/5578292
为避免向SED发送目录名,您的搜索结果应如下所示:
1
| find ./ -type f -exec sed -i -e 's/apple/orange/g' {} \; |
- 您可能需要将sed -i 's/apple/orange/g'更改为sed -i '' 's/apple/orange/g',以使其正常工作。
- -i接受一个参数:用于保存临时文件的扩展名。在gnu-sed中,似乎-i与其论点之间没有空格,但在bsd-sed中有……所以bsd--i '' 's/foo/bar/'相当于gnu--i 's/foo/bar/。
- 实际上,添加-e在mac操作系统上不起作用。touch a b c d e后面跟着上面的命令生成这样的目录列表:a a-e b b-e c c-e d d-e e e-e。
- 对于Mac OS,这将回答stackoverflow.com/questions/19242275/…the RE error: illegal byte sequence。
- 对于鱼壳用户,一定要引用空支架'{}',因为如果没有引用,fish会自动扩展空支架。
- 这个有较短的版本吗?相当长。或者一种使其成为别名/bash函数的方法?
对于较大的S&R任务,使用grep和xargs更好更快,因此,例如;
1
| grep -rl 'apples' /dir_to_search_under | xargs sed -i 's/apples/oranges/g' |
- 谢谢你的回答,非常有帮助!如果在Git存储库中,使用git grep -l 'apples' | xargs sed -i 's/apples/oranges/g'会更快。
这对我很有用:
1
| find ./ -type f -exec sed -i '' 's#NEEDLE#REPLACEMENT#' *.php {} \; |
- 原始问题不限于*.php文件,还有一个.ini文件
1
| grep -e apple your_site_root/**/*.* -s -l | xargs sed -i"""s|apple|orage|" |
我想我们可以用一行简单的命令
1
| for i in `grep -rl eth0 . 2> /dev/null`; do sed -i ‘s/eth0/eth1/’ $i; done |
请参阅本页。
- mywiki.wooledge.org/dontreadlineswithfor
在LIUXOS:
1
| sed -i 's/textSerch/textReplace/g' namefile |
如果"SED"不工作,请尝试:
1
| perl -i -pe 's/textSerch/textReplace/g' namefile |
- 他希望找到子目录中包含该字符串和替换的所有文件,而不仅仅是一个文件