Macos 在OSX中查找并替换为grep和sed

Macos 在OSX中查找并替换为grep和sed,macos,sed,terminal,Macos,Sed,Terminal,我试图用~archive替换同一目录中一堆文件中的字符串#archive。我的文件名中有空格,而且相当长。我检查了一下,有人说我必须用-Z调用grep,用-0调用xargs。我也这样做了 我当前拥有的终端命令如下: grep -lZ '#archive' ~/dropbox/documents/notes/Archive/* | xargs -0 sed -i "" 's|#archive|~archive|g' 我得到的结果是: sed: /Users/bobthebuilder/dropb

我试图用
~archive
替换同一目录中一堆文件中的字符串
#archive
。我的文件名中有空格,而且相当长。我检查了一下,有人说我必须用-Z调用grep,用-0调用xargs。我也这样做了

我当前拥有的终端命令如下:

grep -lZ '#archive' ~/dropbox/documents/notes/Archive/* | xargs -0 sed -i "" 's|#archive|~archive|g'
我得到的结果是:

sed: /Users/bobthebuilder/dropbox/documents/notes/Archive/20130824_1553_I_Kino Interesting Books.txt
/Users/bobthebuilder/dropbox/documents/notes/Archive/20131003_1011_R_ExpensesOct13.txt
/Users/bobthebuilder/dropbox/documents/notes/Archive/20131111_1205_RI_SocialConnect.txt
/Users/bobthebuilder/dropbox/documents/notes/Archive/20131111_2233_I_GymNov13Dec13.txt
/Users/bobthebuilder/dropbox/documents/notes/Archive/20131112_1121_I_LifeChallenge.txt
/Users/bobthebuilder/dropbox/documents/notes/Archive/20131112_1242__PaperlessLiving.txt
/Users/bobthebuilder/dropbox/documents/notes/Archive/20131112_1243__Polymath.txt
/Users/bobthebuilder/dropbox/documents/notes/Archive/20131112_1327__ORDPlanning.txt
/Users/bobthebuilder/dropbox/documents/notes/Archive/20131124_1126__YunheProjectExcel.txt
/Users/bobthebuilder/dropbox/documents/notes/Archive/Contact Information.txt
/Users/bobthebuilder/dropbox/documents/notes/Archive/Excruciatingly Useful Shortcuts.txt
/Users/bobthebuilder/dropbox/documents/notes/Archive/How does this thing work?.txt
/Users/bobthebuilder/dropbox/documents/notes/Archive/Mail Migration.txt
/Users/bobthebuilder/dropbox/documents/notes/Archive/Markdownify.txt
/Users/bobthebuilder/dropbox/documents/notes/Archive/This is the title of a note.txt
: File name too long
什么都没有被取代

我还尝试:

| => grep -l --null '#archive' ~/dropbox/documents/notes/Archive/* | xargs -0 sed -i "" 's|#archive|~archive|g'
sed: RE error: illegal byte sequence

谢谢你的帮助

如果文件位于同一文件夹中

sed -i "" 's/#archive/~archive/' ~/dropbox/documents/notes/Archive/*

如果要将
-i
参数用于
sed
,则需要将命令字符串放在
-e
之后

grep -l --null '#archive' ~/dropbox/documents/notes/Archive/* | xargs -0 sed -e 's|#archive|~archive|g' -i "" 

然而,@NeronLeVelo的答案也是正确的,如果您不需要递归(您不使用递归),那么答案更简单。

谢谢!显然,我的~/.bash_配置文件还有另一个问题,导致了sed:RE错误:非法字节序列。我在我的bash_配置文件中添加了
export LC\u CTYPE=C export LANG=C
,之后你的代码工作得很好!谢谢你的回答!我最后选择了@gaige,因为我想在需要递归的情况下循环代码。