Kolesar
Kolesar

Reputation: 1283

Replace path with another path with sed

I have a file with following lines:

some /foo/foo/foo some
some=/foo/foo/foo some
some /foo/foo/foo/ some
some=/foo/foo/foo/ some
some "/foo/foo/foo" some
some="/foo/foo/foo" some
some "/foo/foo/foo/" some
some="/foo/foo/foo/" some
some '/foo/foo/foo' some
some='/foo/foo/foo' some
some '/foo/foo/foo/' some
some='/foo/foo/foo/ some
some (/foo/foo/foo) some
some=(/foo/foo/foo) some

How can I find and replace this pathS with path with 'frame' like:

some [p]/foo/foo/foo[;p] some
some=[p]/foo/foo/foo[;p] some
some [p]/foo/foo/foo/[;p] some
some=[p]/foo/foo/foo/[;p] some
some "[p]/foo/foo/foo[;p]" some
some="[p]/foo/foo/foo[;p]" some
some "[p]/foo/foo/foo/[;p]" some
some="[p]/foo/foo/foo/[;p]" some
some '[p]/foo/foo/foo[;p]' some
some='[p]/foo/foo/foo[;p]' some
some '[p]/foo/foo/foo/[;p]' some
some='[p]/foo/foo/foo/[;p] some
some ([p]/foo/foo/foo[;p]) some
some=([p]/foo/foo/foo[;p]) some

I wrote almost all of the examples, if someone might have wanted to set up sub-question. Note: Paths are completely arbitrary. I do not know what are paths. I should only know that they should be replaced with a path with 'frame'

Upvotes: 0

Views: 1981

Answers (3)

potong
potong

Reputation: 58578

This might work too:

 sed 's,/.*/[^")'\'' ]*,[p]&[;p],' file

Explanation:

Use ,'s as the s command delimiters. Anchor the regex with the first /. Then use the greedy * to swallow everything upto the last /. Again use the greed of the * to grab the non-delimiters. Then put text either side of the matched regex. This also highlights the use of "punching a hole" in the quoted command to include the single quote '\''.

Upvotes: 2

Kent
Kent

Reputation: 195289

you mentioned:

Note: Paths are completely arbitrary. I do not know what are paths.

I assume the path should be in format \w (a-z A-Z 0-9 or _). then this sed line:

 sed -r 's#(/[a-zA-Z0-9_/]+)#[p]\1[;p]#g' yourFile

will do the job.

see the test with your example. (note I did some changes on the input, to make it "arbitrary")

kent$  cat t
some /foo/foo/fo3o some
some=/foo/foo/fdoo some
some /foo/foo/fxoo/ some
some=/foo/fofo/foo/ some
some "/foxo/foo/foo" some
some="/foo/ffoo/foo" some
some "/foo/foxo/foo/" some
some="/foo/f6oo/foo/" some
some '/foo/fo7o/foo' some
some='/foo/foo7/foo' some
some '/foxo/foo/foo/' some
some='/fo0o/f_oo/foo/ some
some (/foo/f99oox/foo) some
some=(/fo234o/fdoo/fd_oo) some'

kent$  sed -r 's#(/[a-zA-Z0-9_/]+)#[p]\1[;p]#g' t
some [p]/foo/foo/fo3o[;p] some
some=[p]/foo/foo/fdoo[;p] some
some [p]/foo/foo/fxoo/[;p] some
some=[p]/foo/fofo/foo/[;p] some
some "[p]/foxo/foo/foo[;p]" some
some="[p]/foo/ffoo/foo[;p]" some
some "[p]/foo/foxo/foo/[;p]" some
some="[p]/foo/f6oo/foo/[;p]" some
some '[p]/foo/fo7o/foo[;p]' some
some='[p]/foo/foo7/foo[;p]' some
some '[p]/foxo/foo/foo/[;p]' some
some='[p]/fo0o/f_oo/foo/[;p] some
some ([p]/foo/f99oox/foo[;p]) some
some=([p]/fo234o/fdoo/fd_oo[;p]) some'

Upvotes: 1

jaypal singh
jaypal singh

Reputation: 77185

May be this could offer some help:

[jaypal:~/Temp/tem] cat file
some /foo/foo/foo some
some=/foo/foo/foo some
some /foo/foo/foo/ some
some=/foo/foo/foo/ some
some "/foo/foo/foo" some
some="/foo/foo/foo" some
some "/foo/foo/foo/" some
some="/foo/foo/foo/" some
some '/foo/foo/foo' some
some='/foo/foo/foo' some
some '/foo/foo/foo/' some
some='/foo/foo/foo/ some
some (/foo/foo/foo) some
some=(/foo/foo/foo) some

[jaypal:~/Temp/tem] sed 's@/foo/foo/foo/\?@[p]&[;p]@' file
some [p]/foo/foo/foo[;p] some
some=[p]/foo/foo/foo[;p] some
some [p]/foo/foo/foo/[;p] some
some=[p]/foo/foo/foo/[;p] some
some "[p]/foo/foo/foo[;p]" some
some="[p]/foo/foo/foo[;p]" some
some "[p]/foo/foo/foo/[;p]" some
some="[p]/foo/foo/foo/[;p]" some
some '[p]/foo/foo/foo[;p]' some
some='[p]/foo/foo/foo[;p]' some
some '[p]/foo/foo/foo/[;p]' some
some='[p]/foo/foo/foo/[;p] some
some ([p]/foo/foo/foo[;p]) some
some=([p]/foo/foo/foo[;p]) some
[jaypal:~/Temp/tem] 

Upvotes: 0

Related Questions