linux递归替换文件内容,macos - 在Mac和Linux上的文本文件中递归搜索和替换

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值