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

时间:2015-01-16 17:33:43

标签: regex awk sed brackets

来自问题,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");

提前感谢许多人。

1 个答案:

答案 0 :(得分:3)

这样的东西
sed  's/\(.*(\(.*\));\)/printf ("locking \2");\n\1\nprintf("locked \2");/g'

<强>测试

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

$ 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");

修改

确切地说

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

<强>测试

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");

为了更好的安全性,您可以写

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