在OSX中使用grep和sed进行查找和替换

3

我想要替换同一目录下一系列文件中的字符串#archive~archive。我的文件名中有空格并且较长。我查了一下,有人说我需要使用grep -Z和xargs -0命令。于是我就这么做了。

我现在使用的终端命令是:

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

需要帮助!

2个回答

5
如果文件在同一个文件夹中。
sed -i "" 's/#archive/~archive/' ~/dropbox/documents/notes/Archive/*

谢谢你的回答!最终我选择了 @gaige,因为我想在需要递归的情况下重复使用代码。 - chronologos

4

如果您要使用-i参数来执行sed命令,您需要在-e后面加上命令字符串。

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

然而,@NeronLeVelo的答案同样是正确的,如果您不需要使用递归(而且您也没有使用递归),那么这种方法更简单。

谢谢!显然,我的~/.bash_profile文件还有另一个问题,导致了“sed: RE error: illegal byte sequence”的错误。我在bash_profile中添加了“export LC_CTYPE=C export LANG=C”,之后您的代码就可以正常工作了! - chronologos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接