0

From the Question, Print text between delimiters using sed I am able to get the text between brackets. But when i want to modify, I am finding difficulty. Can somebody, please help me?

simple case:

input:

mutex_lock(rdlock);

output: Here, I want to print the name text between () before and after as below.

printf("locking rdlock");mutex_lock(rdlock);printf("locked rdlock");

complicated case:

input:

mutex_lock(&in->bq[CPORT].lock);

output:

printf("locking &in->bq[CPORT].lock");mutex_lock(&in->bq[CPORT].lock);printf("locked &in->bq[CPORT].lock");

Thanks many in advance.

Community
  • 1
  • 1
Balamurugan A
  • 1,886
  • 2
  • 17
  • 19

1 Answers1

3

Something like

sed  's/\(.*(\(.*\));\)/printf ("locking \2");\n\1\nprintf("locked \2");/g'

Test

$ echo  "mutex_lock(rdlock);" | sed  's/\(.*(\(.*\));\)/printf ("locking \2");\n\1\nprintf("locking \2");/g'
printf ("locked rdlock");
mutex_lock(rdlock);
printf("locking rdlock");

and

$ echo  "mutex_lock(&in->bq[CPORT].lock);" | sed  's/\(.*(\(.*\));\)/printf ("locking \2");\n\1\nprintf ("locking \2");/g'
printf ("locking &in->bq[CPORT].lock");
mutex_lock(&in->bq[CPORT].lock);
printf ("locking &in->bq[CPORT].lock");

EDIT

To be exact

sed  's/\(mutex_lock(\(.*\));\)/printf ("locking \2");\n\1\nprintf ("locking \2");/g'

Test

echo  "mutex_lock(&in->bq[CPORT].lock);" | sed  's/\(mutex_lock(\(.*\));\)/printf ("locking \2");\n\1\nprintf ("locking \2");/g'
printf ("locking &in->bq[CPORT].lock");
mutex_lock(&in->bq[CPORT].lock);
printf ("locking &in->bq[CPORT].lock");

For better safety, you can write

sed -r  's/(mutex_lock\(([^)]*)\);)/printf ("locking \2);\n\1\nprintf ("locking \2");/g'
  • [^)] negatec character class. Would match anything other than )
nu11p01n73R
  • 26,397
  • 3
  • 39
  • 52