我有一些脚本,我想扫描一个特定类型的字符串,并替换这些字符串中的点。我们要把定位器策略从map替换成其他的东西,所以必须把变量从有点的变成有下划线的。
在下面,我想改变
driver.click(objectMap.getIdentifier(new.dropdown), "DropDown clicking");
TO
driver.click(new_dropdown, "DropDown clicking");
所以2件事。
objectMap.getIdentifier
如果我尝试使用 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");
}
}
它很丑,它是 镇静剂,它的工作原理是(只要带有 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");
}
}
根据上级的意见,要求进行两项修改
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");
}
}