Marcos R
Marcos R

Reputation: 21

Trying to take input file and textline from a given file and save it to other, using bash

What I have is a file (let's call it 'xfile'), containing lines such as

file1 <- this line goes to file1
file2 <- this goes to file2

and what I want to do is run a script that does the work of actually taking the lines and writing them into the file.

The way I would do that manually could be like the following (for the first line)

(echo "this line goes to file1"; echo) >> file1

So, to automate it, this is what I tried to do

IFS=$'\n'
for l in $(grep '[a-z]* <- .*' xfile); do
$(echo $l | sed -e 's/\([a-z]*\) <- \(.*\)/(echo "\2"; echo)\>\>\1/g')
done
unset IFS

But what I get is

-bash: file1(echo "this content goes to file1"; echo)>>: command not found
-bash: file2(echo "this goes to file2"; echo)>>: command not found

(on OS X)

What's wrong?

Upvotes: 2

Views: 38

Answers (2)

Grisha Levit
Grisha Levit

Reputation: 8617

You can use the regex capabilities of bash directly. When you use the =~ operator to compare a variable to a regular expression, bash populates the BASH_REMATCH array with matches from the groups in the regex.

re='(.*) <- (.*)'
while read -r; do
    if [[ $REPLY =~ $re ]]; then
        file=${BASH_REMATCH[1]}
        line=${BASH_REMATCH[2]}
        printf '%s\n' "$line" >> "$file"
    fi
done < xfile

Upvotes: 1

Karthick Vinod
Karthick Vinod

Reputation: 1437

This solves your problem on Linux

awk -F ' <- ' '{print $2 >> $1}' xfile

Take care in choosing field-separator in such a way that new files does not have leading or trailing spaces.

Give this a try on OSX

Upvotes: 2

Related Questions