在文件的grep中使用动态模式

时间:2014-06-24 19:30:45

标签: regex awk grep

所以这就是问题所在。我有一个文件说A.java。现在不要理会语法。但这是我的目标。

import com.random.OrderSRO;
import com.random.SuborderSRO;

    public A {


        public void doRandom(){
            OrderSRO orderSRO = service.getOrderByCode(request).getOrderSRO();
            oEDTO.setCustomerName(orderSRO.getCustomerName());
            for (SuborderSRO suborderSRO : orderSRO.getSuborders()) {
                SOI undeliveredSOI = iShService.getSOIBySuborder(suborderSRO.getCode());
            oEDTO.setSuborders(allSuborders);
            oEDTO.setShDetail(pack.getShDetail());
            oEDTO.setShMethod(pack.getShMethod().getCode());
            oEDTO.setPurchaseDate(DateUtils.dateToString(orderSRO.getCreated(), "yyyy-MM-dd HH:mm:ss"));
            oEDTO.setTotalAmount(orderSRO.getSellingPrice());
            oEDTO.setPaidAmount(orderSRO.getPaidAmount());
            oEDTO.setSdCash(orderSRO.getSdCash());
            oEDTO.setShDetailsRequired(true);
        }
        public void doRandom1() {
            OrderSRO orderSRO1 = service.getOrderByCode(request).getOrderSRO();              
            oEDTO.setPurchaseDate(DateUtils.dateToString(orderSRO1.getCreated(), "yyyy-MM-dd HH:mm:ss"));
            oEDTO.setTotalAmount(orderSRO1.getSellingPrice());
            oEDTO.setPaidAmount(orderSRO1.getPaidAmount());
            oEDTO.setSdCash(orderSRO1.getSdCash());
        }
    }

我需要检查A.java中正在使用的OrderSRO的哪些方法。让我解释一下我使用的方法。

所以我需要检查像

这样的模式
OrderSRO orderSRO = orderClientService.getOrderByCode(request).getOrderSRO();

现在我有可变的orderSRO。我现在需要再次在同一个文件A.java中 这个变量

虽然我已经能够实现它,但我的方法并不干净。想知道它是否可以巧妙地完成,比如说一行

grep -o 'OrderSRO .*=' EmailServiceImpl.java | awk '{ct[$2];} END {for (var in ct) {str=str "|" var "\\.[a-zA-Z]*"};print str}' >> pat2.txt

cat pat2.txt. This gives me 
orderSRO1\.[a-zA-Z]*|orderSRO\.[a-zA-Z]*

grep -Ewof pat2.txt A.java | sort -u

orderSRO.getCode
orderSRO.getCreated
orderSRO.getCustomerName
orderSRO.getMobile
orderSRO.getPaidAmount
orderSRO.getSdCash
orderSRO.getSellingPrice
orderSRO.getSuborders
orderSRO1.getMobile
orderSRO1.getPaidAmount
orderSRO1.getSdCash
orderSRO1.getSellingPrice
orderSRO1.getSuborders

1 个答案:

答案 0 :(得分:0)

我无法自拔。这是一个非常自定义的awk脚本:

awk -F"[.]*OrderSRO[ ]*|[ ]*=" 'NF>2 {a[$2]; next} {for( i in a ) {c=split($0, line, i".|[(][)]"); if(c==3&&line[2]!~/^\./) print i"."line[2]}}' A.java

产生:

orderSRO.getCustomerName
orderSRO.getSuborders
orderSRO.getCode
orderSRO.getCreated
orderSRO.getSellingPrice
orderSRO.getPaidAmount
orderSRO.getSdCash
orderSRO1.getCreated
orderSRO1.getSellingPrice
orderSRO1.getPaidAmount
orderSRO1.getSdCash

其中方法调用按文件顺序排列,并至少具有以下假设:

  • 变量声明是一行
  • 方法调用适用于POJO getters w / o args
  • 所说的getter调用是一行

它与问题输出不匹配,因为样本orderSRO.getMobile()中不存在A.java之类的内容。

这是一个多线视图:

awk -F"[.]*OrderSRO[ ]*|[ ]*=" '
NF>2 {a[$2]; next}
{
  for( i in a ) {
    c=split($0, line, i".|[(][)]")
    if(c==3&&line[2]!~/^\./)
      print i"."line[2]
  }
}' A.java

可以翻译成:

  • 设置FS以在NF>2
  • 时查找变量名称
  • NF>2时,将变量名添加到数组中,不要尝试处理该行
  • 对于不是变量名称的每一行,请对其进行处理
  • split()变量名称+"。"或"()" (这就是为什么这只适用于没有arg getters的原因)
  • split()计数(c)为3时,第二个元素应为吸气剂
  • 除了"()"导致误报,因此抛弃以"。"
  • 开头的方法
  • 打印出变量名称后跟"。"和no arg getter方法名称。

如果你必须一直这样做,那么你最好使用能够原生地理解代码的东西。也就是说,在没有多次搜索的情况下,我无法想到在Eclipse中执行此操作的方法。