Использование grep с sed и запись нового файла на основе результатов - PullRequest
1 голос
/ 26 января 2012

Я очень плохо знаком с некоторыми из утилит командной строки и некоторое время искал команду, которая бы достигла моей цели.

Цель состоит в том, чтобы найти файлы, содержащие строку текста, заменить ее новой строкой, а затем записать результаты в файл, имя которого совпадает с оригиналом, но в другом каталоге.

Очевидно, что это не работает, поэтому я спрашиваю, как вы, кто знает об этом материале, пошли бы на это.

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

Спасибо за ваш вклад! John

Ответы [ 4 ]

2 голосов
/ 26 января 2012
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 голос
/ 26 января 2012
#!/bin/bash

for file in *; do
  if grep -qF 'stringToFind' "$file"; then
    sed 's/oldString/newString/g' "$file" > "./new/$file"
  fi
done
0 голосов
/ 08 июня 2012

Вы пытаетесь:

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

sed:

  • i in_place
  • e exec другая командаили скрипт

grep:

  • R рекурсивный
  • s Подавление сообщений об ошибках
  • i игнорировать с учетом регистра
0 голосов
/ 26 января 2012
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
...