【问题标题】:Find and Replace with grep and sed in OSX在 OSX 中使用 grep 和 sed 查找和替换
【发布时间】:2014-02-11 03:02:21
【问题描述】:

我正在尝试用~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

我们将不胜感激!

【问题讨论】:

    标签: macos sed terminal


    【解决方案1】:

    如果文件在同一个文件夹中

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

    【讨论】:

    • 感谢您的回答!我最后选择了@gaige,因为我想在需要递归的情况下回收代码。
    【解决方案2】:

    如果您要将-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。我将export LC_CTYPE=C export LANG=C 添加到我的 bash_profile 中,之后您的代码运行良好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2017-05-14
    • 2020-08-05
    • 2019-11-29
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    相关资源
    最近更新 更多