Answers:
OS X混合使用了BSD和GNU工具,因此最好始终检查文档(尽管我发现它less
甚至不符合OS X手册页):
sed将参数after -i
作为备份的扩展名。提供空字符串(-i ''
)表示不进行备份。
应该执行以下操作:
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
这-type f
只是个好习惯;如果给sed一个目录,sed会抱怨。
-exec
优先于xargs
; 您无需理会-print0
或任何事情。将{} +
在年底意味着find
将所有结果作为参数添加的,而不是给被叫命令的一个实例,再运行它为每个结果。(一个例外是当操作系统允许的最大命令行参数数被破坏时;在这种情况下,find
它将运行多个实例。)
%
字符:sed "s%localhost/site%blah/blah%"
。另一种选择是反斜杠转义分隔符:sed "s/localhost\/site/blah\/blah/"
。
illegal byte sequence
出错吗?如果是这样,请尝试:LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
,它对我有用。
/g
用于多个事件,例如LC_ALL=C find . -type f -exec sed -i '' s/search/replace/g {} +
对于Mac,更类似的方法是:
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
find . -name '*.php' -print0 | xargs -0 sed -i "" "s/easyform/form360/g"
作为替代解决方案,我在Mac OSX 10.7.5上使用了此解决方案
grep -ilr 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
以上在OSX上均不起作用。
请执行下列操作:
perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt
在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'
export LC_CTYPE=C && export LANG=C
每当我键入此命令时,我似乎总会把它弄糊涂了,或者忘记了一个标志。我基于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”“替换-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
我使用了这种格式-但是...我发现我必须运行它三次或多次才能使其真正更改每个我发现极为奇怪的实例。运行一次将更改每个文件中的某些内容,但不是全部。两次运行完全相同的字符串将捕获所有实例。
find . -type f -name '*.txt' -exec sed -i '' s/thistext/newtext/ {} +
g
,否则它将仅替换thistext
一行中的第一个匹配项。因此,您的正则表达式应为s/thistext/newtext/g
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
OSX上的命令应与漂亮用户界面下的Unix完全相同。
-print0
加入到find
标志和-0
到xargs
标志。
-exec sed -i s/this/that/g {} \+
代替-print
and xargs
xargs
可能会将以空格分隔的“ ./jacobus”作为要传递给的文件sed
,然后使用“ R.txt” ,都不存在。
apple.stackexchange.com
linux或所有开发人员都不够通用。