macos - 在Mac和Linux上的文本文件中递归搜索和替换
在linux shell中,以下命令将递归搜索并将'this'的所有实例替换为'that'(我在我面前没有Linux shell,但它应该这样做)。
find . -name "*.txt" -print | xargs sed -i 's/this/that/g'
OSX上的类似命令会是什么样的?
Jack asked 2019-07-21T03:19:24Z
14个解决方案
218 votes
OS X使用混合的BSD和GNU工具,所以最好总是查看文档(尽管我有-type f甚至不符合OS X联机帮助页):
[https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sed.1.html]
sed将-type f之后的参数作为备份的扩展名。 提供空字符串(-exec)以进行无备份。
以下应该做:
-type f
-type f只是一个很好的做法; 如果你给它一个目录左右,sed会抱怨。-exec优先于xargs; 你不需要打扰-print0或任何东西。最后的{} +意味着find将所有结果作为参数附加到被调用命令的一个实例,而不是为每个结果重新运行它。 (一个例外是当操作系统允许的最大命令行参数数量被破坏时;在这种情况下,find将运行多个实例。)
TaylanUB answered 2019-07-21T03:20:17Z
114 votes
对于mac,更类似的方法是这样的:
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
Will answered 2019-07-21T03:20:43Z
11 votes
作为替代解决方案,我在Mac OSX 10.7.5上使用这个
grep -ilr 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
归功于:Todd Cesere的回答
Maciej Gurban answered 2019-07-21T03:21:16Z
11 votes
在Mac OSX 10.11.5上,这很好用:
grep -rli 'old-word' * | xargs -I@ sed -i '' 's/old-word/new-word/g' @
madx answered 2019-07-21T03:21:42Z
9 votes
以上都不适用于OSX。
请执行下列操作:
perl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txt
eb80 answered 2019-07-21T03:22:10Z
7 votes
适用于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'
vroc answered 2019-07-21T03:22:37Z
1 votes
这是我可行的。 在mac OS X 10.10.4上
grep -e 'this' -rl . | xargs sed -i '' 's/this/that/g'
以上使用find将更改不包含搜索文本的文件(在文件末尾添加新行),这是详细的。
NoteCode answered 2019-07-21T03:23:13Z
1 votes
如果您使用的是zsh终端,则可以使用通配符魔术:
sed -i "" "s/search/high-replace/g" *.txt
Mentor answered 2019-07-21T03:23:46Z
0 votes
每当我输入这个命令时,我似乎总是把它弄干,或忘记一面旗帜。 我根据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
Nate Flink answered 2019-07-21T03:24:43Z
0 votes
[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
user4425237 answered 2019-07-21T03:25:20Z
0 votes
find . -type f | xargs sed -i '' 's/string1/string2/g'
请参阅此处了解更多信息。
user2725109 answered 2019-07-21T03:25:49Z
0 votes
我使用了这种格式 - 但是......我发现我必须运行它三次或更多次才能让它真正改变我发现的每一个非常奇怪的实例。 运行一次会改变每个文件中的一些但不是全部。 运行完全相同的字符串两到四次将捕获所有实例。
find . -type f -name '*.txt' -exec sed -i '' s/thistext/newtext/ {} +
user1399145 answered 2019-07-21T03:26:18Z
-3 votes
OSX上的命令应该与漂亮UI下的Unix完全相同。
clops answered 2019-07-21T03:26:46Z
-3 votes
可以说$ PWD而不是“。”
Samuel Devlin answered 2019-07-21T03:27:12Z