使用sed和正则表达式交换字符串的一部分

时间:2012-01-21 17:53:49

标签: regex

以下是我在vim中编辑的文件的示例

cutAct = new QAction( tr( "Cut" ) );
cutAct->setShortcut( QKeySequence::Cut );
cutAct->setStatusTip( tr( "Cut the current selection" ) );
connect( cutAct, SIGNAL( triggered() ), this, SLOT( cut() ) );

我正在尝试使用vim命令窗格中的sed将cutAct的所有实例转换为actionCut,目的是在使用它来对其他元素进行类似的转换之前测试我的表达式我的代码具有<someString>Act名称,因此它们都遵循action<SomeString>命名约定。所以基本上:

  1. 从cutAct开始
  2. 在“行动”部分之前将其削减一半,因此将其裁减并执行
  3. 大写'c',因此我有'Cut'和'Act'
  4. 删除'Act'并将其替换为'cut'前面的'action'。
  5. 这是我追求的一个例子

    actionCut = new QAction( tr( "Cut" ) );
    actionCut->setShortcut( QKeySequence::Cut );
    actionCut->setStatusTip( tr( "Cut the current selection" ) );
    connect( actionCut, SIGNAL( triggered() ), this, SLOT( cut() ) )
    

    我正在尝试使用以下命令来执行此操作

    s_[a-z]\(.*\)Act_action\u\1_g
    

    但我得到的是这个

    actionUtAct = new Qion( tr( "Cu&t" ), this );
    actionUt->setShortcut( QKeySequence::Cut );
    actionUt->setStatusTip( tr( "Cut the current selection" ) );
    actionOnnect( cut, SIGNAL( triggered() ), diaryEditor, SLOT( cut() ) );
    

    这是我第一次尝试使用正则表达式时,我会相信我的表达式会返回每个字符串,从小写字母开始,然后在“Act”中删除,最后删除Act,使第一个字符成为大写字母并在前面加上“动作”,但这显然不是正在发生的事情。

    有人可以告诉我如何修改我的表达以实现我的目标吗?

3 个答案:

答案 0 :(得分:2)

在你的例子中:

c * utAct = new QAct * ion(tr(“Cut”));

正则表达式中的第1组与斜体部分匹配。最初的[a-z]位于括号之外,正则表达式是贪婪的,因此.*后跟Act将匹配字符串中的 last “Act”,而不是第一个。

试试这个:s_\([a-z]\w*\)Act_action\u\1_g

答案 1 :(得分:0)

试试这个:

s_\([a-z]\w*\)Act_action\u\1_g

它产生以下结果:

actionCut = new QAction( tr( "Cut" ) );
actionCut->setShortcut( QKeySequence::Cut );
actionCut->setStatusTip( tr( "Cut the current selection" ) );
connect( actionCut, SIGNAL( triggered() ), this, SLOT( cut() ) );

答案 2 :(得分:0)

.*是贪婪的,即它会匹配最长的字符串;换句话说,你正在取代“行动”的最后次,而不是第一次。

据我所知,从A到B的最简单方法是s_cutAct_actionCut_g

编辑:这是一种更为普遍的尝试,可以按照您的描述进行操作:

s_\([a-z]+\)Act_Action\u\1_g

换句话说,对于与Act相邻的任何小写字符串,前置Action,大写,并删除Act后缀。