user1941145
user1941145

Reputation: 31

List path with word match in bash script

I have a string that contain a list of lines.I want to search any particular string and list all the path that contains the string. The given string contains the following:

  755677 myfile/Edited-WAV-Files
  756876 orignalfile/videofile
  758224 orignalfile/audiofile
  758224 orignalfile/photos 
  758225 others/video
  758267 others/photo 
  758268 orignalfile/videofile1
  758780 others/photo1

I want to extract and list only the path that start from Orignal File. My output should be like this:

 756876 orignalfile/videofile
 758224 orignalfile/audiofile
 758224 orignalfile/photos 
 758268 orignalfile/videofile1

Upvotes: 0

Views: 143

Answers (5)

DigitalRoss
DigitalRoss

Reputation: 146043

That looks easy enough...

echo "$string" | grep originalfile/

or

grep originalfile/ << eof
$string
eof

or, if it's in a file,

grep originalfile/ sourcefile

Upvotes: 1

Phil Frost
Phil Frost

Reputation: 3966

egrep '^[0-9]{6} orignalfile/' <<<"$string"

note:

  • the ^ matches the start of the string. You don't want to match things that happen to have orignalfile/ somewhere in the middle

  • [0-9]{6} matches the six digits at the start of each line

Upvotes: 0

reichhart
reichhart

Reputation: 879

Are you sure that your string contains linebreaks/newlines? If it does then the solution of DigitalRoss will apply.

If it doesn't contain newlines then you must include them. In example if your code looks like

string=$(ls -l)

then you must prepend it with field separator string without linefeed:

IFS=$'\t| ' string=$(ls -l)

or with an empty IFS var:

IFS='' string=$(ls -l)

Docs for IFS from the bash man page:

IFS    The  Internal  Field  Separator  that  is  used for word splitting after
       expansion and to split lines into words with the read builtin command.  The
       default value is ``<space><tab><newline>''.

Upvotes: 0

Vladimir Kolesnikov
Vladimir Kolesnikov

Reputation: 991

If your string spans several lines like this:

755677 myfile/Edited-WAV-Files
756876 orignalfile/videofile
758224 orignalfile/audiofile
758224 orignalfile/photos
758225 others/video
758267 others/photo
758268 orignalfile/videofile1
758780 others/photo1

Then you can use this code:

echo "$(echo "$S" | grep -F ' orignalfile/')"

If the string is not separated by new lines then

echo $S | grep -oE "[0-9]+ orignalfile/[^ ]+"

Upvotes: 0

Guru
Guru

Reputation: 16974

A bash solution:

while read f1 f2
do
     [[ "$f2" =~ ^orignal ]] && echo $f1 $f2
done < file

Upvotes: 0

Related Questions