sed命令来代替点

问题描述 投票:0回答:1

我有一些脚本,我想扫描一个特定类型的字符串,并替换这些字符串中的点。我们要把定位器策略从map替换成其他的东西,所以必须把变量从有点的变成有下划线的。

在下面,我想改变

driver.click(objectMap.getIdentifier(new.dropdown), "DropDown clicking");

TO

driver.click(new_dropdown, "DropDown clicking");

所以2件事。

  1. 去掉文字 objectMap.getIdentifier
  2. 将封闭的字符串从有点改为下划线。

如果我尝试使用 sed 's/./_/g' >> 这将替换掉所有的点,我只想替换掉包含在下面的点。objectMap.getIdentifier.试过这些sed命令,但用处不大。sed -e 's/objectMap.getIdentifier("\(.*\).\(.*\)")/(\1_\2)/pg'

例子 :

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

    public class TestingScript {
    public void createNewItems(String itemName){
    driver.click(objectMap.getIdentifier(new.dropdown), "DropDown clicking");
    driver.click((objectMap.getIdentifier("new.dropdown.notes.button"), "Note from template");
    driver.click((getElement(objectMap.getIdentifier("modal.default.template").replace("$Template",  "Default")), "Default", true);
    driver.click((getElementByText(templateName), templateName);
    driver.click(objectMap.getIdentifier(new.dropdown), "DropDown clicking");
    driver.click((objectMap.getIdentifier("modal.create.button"), "Create");
  } 
}
shell sed replace substitution
1个回答
1
投票

它很丑,它是 ,它的工作原理是(只要带有 objectMap.getIdentifier() 不含 #)

#!/bin/bash

sed '
/objectMap\.getIdentifier(/{
    # copy pattern-space to hold-space
      h;
    # replace pattern-space with only the contents inside objectMap.getIdentifier()
      s/^.*objectMap\.getIdentifier(\([^)]*\)).*$/\1/;
    # replace all dots with underscores
      s/\./_/g;
    # swap pattern-space with hold-space
      x;
    # Replace objectMap.getIdentifier(.*) with a "#"
      s/objectMap\.getIdentifier([^)]*)/#/;
    # Append hold-space to pattern-space (with new-line between)
      G;
    # parse out the contents we want, use "#" as key for replacement
      s/^\([^#]*\)#\(.*\)\n\(.*\)$/\1\3\2/
}' ./infile

概念验证

$ sed '/objectMap\.getIdentifier(/{h;s/^.*objectMap\.getIdentifier(\([^)]*\)).*$/\1/;s/\./_/g;x;s/objectMap\.getIdentifier([^)]*)/#/;G;s/^\([^#]*\)#\(.*\)\n\(.*\)$/\1\3\2/}' ./infile
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

    public class TestingScript {
    public void createNewItems(String itemName){
    driver.click(new_dropdown, "DropDown clicking");
    driver.click(("new_dropdown_notes_button", "Note from template....");
    driver.click((getElement("modal_default_template".replace("$Template",  "Default")), "Default", true);
    driver.click((getElementByText(templateName), templateName);
    driver.click(new_dropdown, "DropDown clicking");
    driver.click(("modal_create_button", "Create");
  }
}

0
投票

根据上级的意见,要求进行两项修改

  • 如果钥匙是 get_identifier 是字符串文字 objectMap.get_identifier("foo.bar.zoo")移除引号,并将键值用'_'转换为符号名。foo_bar_zoo
  • 如果键是一个变量 objectMap.getIdentifier(new.dropdown),应该转换为_分隔键。new_dropdown

用sed做这个很棘手,因为sed是面向行的,很难把'.'替换的范围限制在一行。 我相信Perl在这里会做得更好。不完全在 OP 的约束范围内(要求 sed 的解决方案)。

第一个'-e'定义一个函数来翻译一个单一的标记('. '-> '_', 去掉引号)第二个'-pe'将函数应用到输入中。

perl -e 'sub fix { $_ = shift ; s/"//g ; s/\./_/g ; return $_  }' -pe 's/objectMap\.getIdentifier\(("?[a-z.]+"?)\)/fix($1)/e' < a.java

如果创建一个perl脚本,做同样的事情,可能会更容易。

#! /usr/bin/perl
use strict ;
sub fix { $_ = shift ; s/"//g ; s/\./_/g ; return $_  }

while ( <> ) {
    s/objectMap\.getIdentifier\(("?[a-z.]+"?)\)/fix($1)/e ;
    print ;
}

输出(用于样本输入)。注意到不平衡括号,存在于输入数据中。

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

    public class TestingScript {
    public void createNewItems(String itemName){
    driver.click(new_dropdown, "DropDown clicking");
    driver.click((new_dropdown_notes_button, "Note from template");
    driver.click((getElement(modal_default_template.replace("$Template",  "Default")), "Default", true);
    driver.click((getElementByText(templateName), templateName);
    driver.click(new_dropdown, "DropDown clicking");
    driver.click((modal_create_button, "Create");
  } 
}

© www.soinside.com 2019 - 2024. All rights reserved.