在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而不是“”。