grep и замените строку, распределенную на несколько строк - PullRequest
0 голосов
/ 26 января 2019

У меня есть строка, которую я хочу заменить.Он имеет формат:

  VAL1          = "D_AC" ,
  VAL2          = "DRC" ,
  VALX2         = 3.33330000e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 

Обратите внимание, что строка содержит как двойные кавычки, так и символы новой строки.

Я хочу заменить ее на другую строку:

  VAL1          = "D_AC" ,
  VAL2          = "DRC" ,
  VALX2         = 2.22110000e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 

Я пытался:

export OLD_STRING1="  VAL1          = \"D_AC\" ,"
export OLD_STRING2="  VAL2          = \"DRC\" ,"
export OLD_STRING3="  VALX2         = 3.33330000e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, "

export NEW_STRING1="  VAL1          = \"D_AC\" ,"
export NEW_STRING2="  VAL2          = \"DRC\" ,"
export NEW_STRING3="  VALX2         = 2.22110000e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, "

Затем вызывается grep и sed следующим образом:

find . -type f -name '*filename*' -exec sed -i '' s/$OLD_STRING1$OLD_STRING2$OLD_STRING3/$NEW_STRING1$NEW_STRING2$NEW_STRING3/ {} +

sed генерирует ошибку:

sed: 1: "s/BX2          = "D_AC ...": unterminated substitute pattern

Как я могу решить это?

1 Ответ

0 голосов
/ 27 января 2019

Это было бы кошмаром, чтобы попытаться сделать надежно и переносимо с помощью sed, так как sed не понимает буквальные строки (см. Возможно ли надежно избежать метасимволов регулярных выражений с помощью sed ).

С учетом этого ввода вы хотите изменить file так, чтобы текст, содержащийся в old, стал текстом, содержащимся в new:

$ cat old
  VAL1          = "D_AC" ,
  VAL2          = "DRC" ,
  VALX2         = 3.33330000e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
$
$ cat new
  VAL1          = "D_AC" ,
  VAL2          = "DRC" ,
  VALX2         = 2.22110000e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
$
$ cat file
foo
  VAL1          = "D_AC" ,
  VAL2          = "DRC" ,
  VALX2         = 3.33330000e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
bar

и этот скрипт:

$ cat tst.awk
FILENAME==ARGV[1] { old=$0; next }
FILENAME==ARGV[2] { new=$0; next }
s=index($0,old) {
    $0 = substr($0,1,s-1) new substr($0,s+length(old))
}
{ print }

это так просто:

$ awk -v RS= -f tst.awk old new file
foo
  VAL1          = "D_AC" ,
  VAL2          = "DRC" ,
  VALX2         = 2.22110000e+04, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
bar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...