danstan
danstan

Reputation: 95

extract text from file using sed

I'm trying to write a script in bash which extracts a database name from a PHP file. For example I want to copy CRM_123456789 from the below line:

$sugar_config['dbconfig']['db_name'] = 'CRM_123456789';

I have tried using sed, so essentially I want to copy the text between ['db_name'] = ' and ';

sed -n '/['db_name'] = /,/';/p' myfile.php

However this does not return anything. Does anyone know what I'm doing wrong?

Thanks

Upvotes: 0

Views: 1301

Answers (2)

tripleee
tripleee

Reputation: 189307

You cannot nest single quotes. Your expression evaluates to single-quoted /[ next to unquoted db_name where clearly you want to match on a literal single quote.

One workaround is to use double quotes for the outermost quoting, but make sure you make any necessary changes, because double quotes are weaker than single quotes in the shell. In your case, there's nothing to change in that respect, though.

However, you also appear to misunderstand how sed address expressions work. They identify lines, not substrings on a line. So your script would print between a line matching ['db_name'] and a line matching ';. To extract something from within a line, the common idiom is to substitute out the parts you don't want, then print what's left.

Also, because opening square bracket is a metacharacter in sed, you need to backslash-escape it to match it literally.

sed -n "s/.*\['db_name'] = '\([^']*\)'.*/\1/p" myfile.php

This matches up through ['db_name'] = ', then captures whatever is inside the single-quoted string into \1, then matches anything from the next single quote through the end of line, and substitutes it with just the captured string; and prints that line after performing the substitution.

If the config file supports variable whitespace, a useful improvement would be to allow for optional whitespace around the equals sign, and possibly also within the square brackets. [ ]* will match zero or more spaces (the square brackets aren't really necessary around a single space, but I include them here for legibility reasons).

Upvotes: 2

Avinash Raj
Avinash Raj

Reputation: 174696

You could try the below sed command.

$ sed -n "s/.*\['db_name'\] = '\([^']*\)';.*/\1/p" file
CRM_123456789

Upvotes: 1

Related Questions