I am trying to replace a range of text with sed containing special characters.

I have the following output:

"Users" "/Users/Users"   SERVER1
"Roaming Profiles" "/Roaming Profiles/Roaming Profiles"   SERVER2

I would like it to be like this:

Roaming Profiles SERVER2

2 Answers 2

$ sed -r 's/"([^"]*)"([^"]*"){2}[[:space:]]*/\1 /' file
Roaming Profiles SERVER2

How it works

The sed substitution command has the form s/old/new/. The regular expression for old has the following parts:

  • "([^"]*)" -- This matches the first string in quotes and saves it in group 1.

  • ([^"]*"){2} -- This matches the second quoted string (including the spaces which precede it).

  • [[:space:]]* -- This matches the spaces which follow the second quoted string.

The regular expression for new is simply \1 which is a space followed by the first quoted string which, via the parenthesis, we had saved in group 1.

Mac OSX or other BSD platforms

On OSX, try:

sed -E 's/"([^"]*)"([^"]*"){2}[[:space:]]*/\1 /' file

Using Awk:

awk -F\" '{print $2,$5}' file

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .