Foaminator
Foaminator

Reputation: 33

Using grep with sed and writing a new file based on the results

I'm very new to some of the command line utilities and have been looking for a while for a command that would accomplish my goal.

The goal is to find files that contain a string of text, replace it with a new string, and then write the results to a file that is named the same as the original, but in a different directory.

Obviously this is not working, so I am asking how you who know about this stuff would go about it.

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

Thanks for your input! John

Upvotes: 1

Views: 2068

Answers (4)

fitorec
fitorec

Reputation: 11

You try:

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

sed:

  • i in_place
  • e exec other command or script

grep:

  • R recursive
  • s Suppress error messages
  • i ignore case sensitive

Upvotes: 0

Zsolt Botykai
Zsolt Botykai

Reputation: 51653

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

Will do it for you.

If you have spaces in filenames:

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

Upvotes: 2

jaypal singh
jaypal singh

Reputation: 77145

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

Upvotes: 0

SiegeX
SiegeX

Reputation: 140417

#!/bin/bash

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

Upvotes: 1

Related Questions