将grep与sed一起使用并根据结果编写新文件

时间:2012-01-25 21:54:09

标签: sed grep xargs

我对某些命令行实用程序非常陌生,并且一直在寻找能够实现我的目标的命令。

目标是查找包含文本字符串的文件,将其替换为新字符串,然后将结果写入名称与原始文件相同但位于不同目录中的文件。

显然这不起作用,所以我问你是怎么知道这些东西会发生的。

grep -rl 'stringToFind' *.* | sed 's|oldString|newString|g' < fileNameFromGrep > ./new/fileNameFromGrep

感谢您的投入! 约翰

4 个答案:

答案 0 :(得分:2)

for f in "`find /YOUR/SEARCH/DIR/ROOT -type f -exec fgrep -l 'stirngToFind' \{\} \;`" ; do
    sed 's|oldString|newString|g' < "${f} > ./new/"${f}
done    

会为你做的。

如果文件名中有空格:

OLDIFS=$IFS
IFS=''
find /PATH -print0 -type f | while read -r -d $'' file
do
    fgrep -l 'stirngToFind' "$file" && \
        sed 's|oldString|newString|g' < "${file} > ./new/"${file}
done
IFS=$OLDIFS

答案 1 :(得分:1)

#!/bin/bash

for file in *; do
  if grep -qF 'stringToFind' "$file"; then
    sed 's/oldString/newString/g' "$file" > "./new/$file"
  fi
done

答案 2 :(得分:0)

for file in path/to/dir/*
do
   grep -q 'pattern' "$file" > /dev/null
   if [ $? == 0 ]; then
   sed 's/oldString/newString/g' "$file" > /path/to/newdir/"$file"
   fi
done

答案 3 :(得分:0)

你试试:

sed -ie "s/oldString/newString/g" \
$(grep -Rsi 'pattern' path/to/dir/ | cut -d: -f1)

SED:

  • in_place
  • e 执行其他命令或脚本

的grep:

  • R recursive
  • s 取消错误消息
  • 忽略区分大小写