来自问题,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");
提前感谢许多人。
答案 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'
[^)]
否定字符类。会匹配)