选择括号 () 之间的文本并对其进行操作

selecting the text between brackets () and manipulating it

从问题中,Print text between delimiters using sed 我能够得到括号之间的文本。但是当我想修改时,我发现困难。有人可以帮帮我吗?

简单案例:

输入:

mutex_lock(rdlock);

输出: 在这里,我想在 () 前后打印名称文本,如下所示。

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

复杂情况:

输入:

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

输出:

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

在此先致谢。

类似

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

测试

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

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

编辑

确切地说

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

测试

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

为了安全起见,可以写成

sed -r  's/(mutex_lock\(([^)]*)\);)/printf ("locking );\n\nprintf ("locking ");/g'
  • [^)] 否定字符 class。将匹配 )
  • 以外的任何内容