在linux shell中,以下命令将递归搜索并将'this'的所有实例替换为'that'(我面前没有Linux shell,但应该这样做。)
find . -name "*.txt" -print | xargs sed -i 's/this/that/g'
OSX上的类似命令会是什么样的?
答案 0 :(得分:219)
OS X使用BSD和GNU工具的混合,所以最好总是查看文档(虽然我认为less
甚至不符合OS X联机帮助页):
https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sed.1.html
sed将-i
之后的参数作为备份的扩展名。提供空字符串(-i ''
)以进行无备份。
以下内容应该:
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
-type f
只是一种很好的做法;如果你给它一个目录左右,sed会抱怨。
-exec
比xargs
更受欢迎;你无需担心-print0
或其他任何事情。
最后的{} +
表示find
将所有结果作为参数附加到被调用命令的一个实例,而不是为每个结果重新运行它。 (一个例外是当操作系统允许的最大命令行参数数量被破坏时;在这种情况下find
将运行多个实例。)
答案 1 :(得分:116)
对于mac,更类似的方法是:
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
答案 2 :(得分:11)
作为替代解决方案,我在Mac OSX 10.7.5上使用此解决方案
grep -ilr 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
信用证转到:Todd Cesere's answer
答案 3 :(得分:11)
在Mac OSX 10.11.5上,这很好用:
grep -rli 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
答案 4 :(得分:9)
上述所有工作都不适用于OSX。
执行以下操作:
perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt
答案 5 :(得分:7)
适用于Linux和Mac OS X的版本(通过将-e
开关添加到sed
):
export LC_CTYPE=C LANG=C
find . -name '*.txt' -print0 | xargs -0 sed -i -e 's/this/that/g'
答案 6 :(得分:1)
这是我可行的。在mac OS X 10.10.4上
grep -e 'this' -rl . | xargs sed -i '' 's/this/that/g'
以上使用 find 将更改不包含搜索文本的文件(在文件末尾添加新行),这是详细的。
答案 7 :(得分:1)
如果您使用的是zsh终端,则可以使用通配符:
setTimeout
答案 8 :(得分:1)
2021
什么对我有用:
LC_ALL=C && LANG=C && find . -type f | xargs sed -i '' 's/old/new/g'
答案 9 :(得分:0)
每当我输入这个命令时,我似乎总是把它弄干,或忘记一面旗帜。我根据TaylanUB的答案在github上创建了一个Gist,它从当前目录中进行全局查找替换。这是Mac OSX特有的。
https://gist.github.com/nateflink/9056302
这很好,因为现在我只是弹出一个终端然后复制:
curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s“find-a-url.com”“replace-a-url.com”
你可以得到一些奇怪的字节序列错误,所以这里是完整的代码:
#!/bin/bash
#By Nate Flink
#Invoke on the terminal like this
#curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "find-a-url.com" "replace-a-url.com"
if [ -z "$1" ] || [ -z "$2" ]; then
echo "Usage: ./$0 [find string] [replace string]"
exit 1
fi
FIND=$1
REPLACE=$2
#needed for byte sequence error in ascii to utf conversion on OSX
export LC_CTYPE=C;
export LANG=C;
#sed -i "" is needed by the osx version of sed (instead of sed -i)
find . -type f -exec sed -i "" "s|${FIND}|${REPLACE}|g" {} +
exit 0
答案 10 :(得分:0)
https://bitbucket.org/masonicboom/serp是一个go实用程序(即跨平台),在OSX上测试,对给定目录中的文件中的文本进行递归搜索和替换,并确认每次替换。它是新的,所以可能是错误的。
用法如下:
$ ls test
a d d2 z
$ cat test/z
hi
$ ./serp --root test --search hi --replace bye --pattern "*"
test/z: replace hi with bye? (y/[n]) y
$ cat test/z
bye
答案 11 :(得分:0)
find . -type f | xargs sed -i '' 's/string1/string2/g'
有关更多信息,请参考here。
答案 12 :(得分:0)
我使用了这种格式-但是...我发现我必须运行它三次或多次才能真正更改每个我发现非常奇怪的实例。运行一次将更改每个文件中的某些内容,但不是全部。两次运行完全相同的字符串两次将捕获所有实例。
find . -type f -name '*.txt' -exec sed -i '' s/thistext/newtext/ {} +
答案 13 :(得分:-3)
OSX上的命令应该与漂亮UI下的Unix完全相同。
答案 14 :(得分:-3)
可以说$ PWD而不是“。”