在Mac和Linux的文本文件中进行recursionsearch和replace

在linux shell中,下面的命令将recursion地search并用'that'代替'this'的所有实例(我没有在我之前的Linux shell,但应该这样做)。

find . -name "*.txt" -print | xargs sed -i 's/this/that/g' 

OSX上的类似命令是什么样的?

OS X混合使用了BSD和GNU工具,所以最好总是检查一下文档(尽pipe我已经less了甚至不符合OS X的手册页):

https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sed.1.html

sed将-i后的参数作为备份的扩展名。 为没有备份提供一个空string( -i '' )。

以下应该做的是:

find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +

-type f只是一个很好的做法。 sed会抱怨,如果你给它一个目录左右。 -exec优于xargs ; 你不必打扰-print0或任何东西。 最后的{} +表示find将所有结果作为参数附加到被调用的命令的一个实例上,而不是为每个结果重新运行它。 (一个例外是OS允许的最大数量的命令行参数被破坏;在这种情况下, find将运行多个实例。)

对于mac来说,更类似的方法是:

 find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g" 

作为一种替代解决scheme,我在Mac OSX 10.7.5上使用这个解决scheme

 grep -ilr 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @ 

信用: Todd Cesere的答案

可在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' 

在Mac OSX 10.11.5这工作正常:

 grep -rli 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @ 

以上都没有在OSX上工作。

请执行下列操作:

 perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt 

每当我input这个命令,我似乎总是把它堵上,或者忘掉一面旗帜。 我基于TaylanUB的答案在github上创build了一个Gist,它从当前目录中进行全局查找replace。 这是Mac OSX特定的。

https://gist.github.com/nateflink/9056302

这很好,因为现在我只是popup一个terminal然后复制:

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 

https://bitbucket.org/masonicboom/serp是一个go实用程序(即跨平台),在OSX上进行testing,对给定目录中的文件进行recursionsearch和replace,并确认每个replace。; 这是新的,所以可能是越野车。

用法如下所示:

 $ ls test ad 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 

这是我可行的。 在Mac OS X 10.10.4上

 grep -e 'this' -rl . | xargs sed -i '' 's/this/that/g' 

上面的使用find会改变不包含search文本的文件(在文件末尾添加一个新行),这是冗长的。

OSX上的命令应该和Unix下漂亮的UI下的命令完全一样。

可以只说$ PWD而不是“”。