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

将grep与sed一起使用,并根据结果编写新文件,sed,grep,xargs,Sed,Grep,Xargs,我对一些命令行实用程序非常陌生,一直在寻找一个可以实现我目标的命令 目标是找到包含文本字符串的文件,用新字符串替换它,然后将结果写入与原始文件名相同但位于不同目录中的文件 显然,这是行不通的,所以我想问你们知道这件事的人会怎么做 grep -rl 'stringToFind' *.* | sed 's|oldString|newString|g' < fileNameFromGrep > ./new/fileNameFromGrep grep-rl'stringToFind'*.*

我对一些命令行实用程序非常陌生,一直在寻找一个可以实现我目标的命令

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

显然,这是行不通的,所以我想问你们知道这件事的人会怎么做

grep -rl 'stringToFind' *.* | sed 's|oldString|newString|g' < fileNameFromGrep > ./new/fileNameFromGrep
grep-rl'stringToFind'*.*sed's | oldString | newString | g'/new/fileNameFromGrep
谢谢你的意见! John

在“`find/YOUR/SEARCH/DIR/ROOT-type f-exec fgrep-l'stirngtofid'\{\\\\;`”中表示f;做
sed的| oldString | newString | g'<“${f}>/new/“${f}”
完成
我会帮你的

如果文件名中有空格:

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
OLDIFS=$IFS
如果=“”
find/PATH-print0-type f | while read-r-d$''文件
做
fgrep-l'stirngtofid''$file'&\
sed的| oldString | newString | g'<“${file}>/new/“${file}”
完成
IFS=$OLDIFS
您可以尝试:

sed -ie "s/oldString/newString/g" \
$(grep -Rsi 'pattern' path/to/dir/ | cut -d: -f1)
sed:
  • i到位
  • e执行其他命令或脚本
格雷普:
  • R递归
  • s抑制错误消息
  • i忽略区分大小写

这与文件名中包含空格的文件不同。我不喜欢文件名中的空格,但你是对的@SiegeX。我已经更新了我的答案。谢谢,您的第一个解决方案成功了,但您的第二个解决方案产生了错误:/center.php bash:./center.php>/new3//center.php:当IFS=read-r-d“”文件时,我不建议使用这样的文件或目录;做fgrep…&&sed。。。;完成<@Jaypal西部最快的手指。吹手指=)我是大白北最胖的手指。很快就要搬到坦帕了!!;)@Foaminator它也不会与名称中有空格的文件断开(与您接受的文件不同)。Hanks,此解决方案只找到其中一个文件。@Foaminator子目录下也有文件吗?如果是这种情况,那么如果您有bash4来执行递归操作,那么必须启用globstarsearch@Foaminator我创建的名为files的变量中有一个错误,并且正在使用file。
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
sed -ie "s/oldString/newString/g" \
$(grep -Rsi 'pattern' path/to/dir/ | cut -d: -f1)