2014-09-15 2 views
1

У меня есть данные в файле, который, как:Regex: Выполнение операций на соответствующих группах

... 
Position(123) 
... 
Position(234) 
... 

Я хочу обновить этот файл как:

... 
Position(1230) 
... 
Position(2340) 
... 

Я могу сделать это с помощью Java. Вроде:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class RegexGroupOperation { 
    public static void main(String[] args) { 
     String[] inputLines = new String[5]; 
     inputLines[0] = "Some Random Text"; 
     inputLines[1] = "Position(789)"; 
     inputLines[2] = "Some More Random Text"; 
     inputLines[3] = "Position(123)"; 
     inputLines[4] = "Position(456)"; 

     Pattern p = Pattern.compile("Position\\(([0-9]+)\\)"); 
     for (String line : inputLines) { 
      Matcher m = p.matcher(line); 
      if (m.matches()) { 
       System.out.println("Position(" + (Integer.valueOf(m.group(1)) * 10) + ")"); 
      } else { 
       System.out.println(line); 
      } 
     } 
    } 
} 

Здесь я занимаюсь захватом части строки (группы), на которой я хочу выполнить операцию. Затем обновите эту группу с желаемым результатом.

Я хочу сделать то же самое, используя sed. Можно ли выполнить операцию над согласованной группой, а затем использовать результат в подстановке.

ответ

0

Использование AWK:

awk -F 'Position\\(' 'NF>1{gsub(/.*/, "Position(" $2*10 ")")} 1' file 
... 
Position(1230) 
... 
Position(2340) 
... 
+0

Он заменяет все, что имеет только ')', но 'Position (' does not exists. – Ambrish

+0

ok попробуйте обновленную команду awk. – anubhava

0

Вы можете попробовать следующую команду awk.

$ awk -F[\(\)] '/[0-9]+/{var=$2;$2=var*10; print $1"("$2")"}!/[0-9]/' file 
... 
Position(1230) 
... 
Position(2340) 
... 
+0

Умножив 10 просто как пример. Это может быть любая простая арифметическая операция. – Ambrish

+1

он работает для любого числа. Просто замените 10 в приведенной выше команде номером, который вы хотите. –

0
sed 's/^Position([0-9]*/&0/' YourFile 

Если "просто" добавить 0 в номер позиции (...) линии

Смежные вопросы