AIX文件中的最佳字符串替换

时间:2014-09-10 19:43:09

标签: string replace awk sed find

我需要从通讯组列表中的多个文件中删除大约40封电子邮件。 一个地址可能出现在不同的文件中,需要从所有文件中删除。 我在一个目录中工作,其中有几个.sh文件也有几行。

我在几个测试文件中做过类似的事情:

find . -type f -exec grep -li  ADDRESS_TO_FIND {} 2>/dev/null \; | xargs sed -i 's/ADDRESS_TO_REMOVE/ /g' *

它工作正常,但一旦我在真实文件中尝试它,它需要很长时间,只是坐在那里。我需要在不同的服务器上运行它,这是我想要优化它的主要原因。

我试图运行这样的东西:

find . -type f -name '*sh' 2>/dev/null | xargs grep ADDRESS_TO_FIND

但是会返回:

./FileContainingAddress.sh:ADDRESS_TO_FIND

如何添加以下内容:

awk '{print substr($0,1,10)}'

但要在" :"?

之前将所有内容都归还给我

我可以从那里做其余的事情,但还没找到如何修剪那部分

2 个答案:

答案 0 :(得分:2)

您可以在-exec中使用find作为谓词,只要您不使用多个文件+版本,这意味着您可以提供多个-exec每个条款都取决于前一个条款的成功。这种风格将避免构建文件名列表,这使得它在名称中包含奇数字符的文件中更加健壮。

例如:

find . -type f -name '*sh' \
     -exec grep -qi ADDRESS_TO_FIND {} \; \
     -exec sed -i 's/ADDRESS_TO_FIND/ /g' {} \;

您可能希望将地址作为参数提供,而不是必须输入两次,除非您真的想让两个实例不同(ADDRESS_TO_FINDADDRESS_TO_REMOVE):

clean() {
  find . -type f -name '*sh' \
       -exec grep -qi "$1" {} \; \
       -exec sed -i "s/$1/ /g" {} \;
}

(请注意/参数中的clean。我会让sed更加健壮,作为练习。)

答案 1 :(得分:0)

回顾你的问题之后,我注意到一些可能非常重要的事情:

find -type f -exec grep -li ADDRESS {} \; | xargs sed -i 's/ADDRESS/ /g' *
# here! -----------------------------------------------------------------^

正在扩展星号,因此sed行正在目录中的每个文件上运行。

假设这不是你问题中的拼写错误,我相信这是你表现不佳的根源。你应该删除它!