Замена строки с использованием sed в tcl-скрипте - строка содержит круглые скобки - PullRequest
0 голосов
/ 03 апреля 2019

Я хочу использовать sed в tcl-скрипте для изменения файла (хранящегося в $ file), который содержит строку:

prbs_match_out <= (ch0_prbs_match_dual3_int & ch0_prbs_match_dual2_int & ch0_prbs_match_dual__bs_match_dual__int_cht0) (ch)ch1_prbs_match_dual3_int & ch1_prbs_match_dual2_int & ch1_prbs_match_dual1_int & ch1_prbs_match_int); </p>

до

prbs_match *match * * 101 * *

exec /bin/sed -i {s/(ch0_prbs_match_dual3_int  &  ch0_prbs_match_dual2_int  &  ch0_prbs_match_dual1_int  &  ch0_prbs_match_int) & (   ch1_prbs_match_dual3_int  &  ch1_prbs_match_dual2_int  &  ch1_prbs_match_dual1_int  &  ch1_prbs_match_int)/ch0_prbs_match_int & ch1_prbs_match_int/g}  $file

Вышеприведенная команда sed не работает (получить неправильную подстановку).Как мне обращаться с круглыми скобками и амперсандами в sed?

Ответы [ 4 ]

1 голос
/ 04 апреля 2019

Я понял - команда tcl "string map" сработала.Спасибо за вашу помощь.

package require Tcl 8.5

package require fileutil

# Parameters for the replacement 
set from "(   ch0_prbs_match_dual3_int  &  ch0_prbs_match_dual2_int  &  ch0_prbs_match_dual1_int  &  ch0_prbs_match_int) & (   ch1_prbs_match_dual3_int  &  ch1_prbs_match_dual2_int  &  ch1_prbs_match_dual1_int  &  ch1_prbs_match_int)"
set to "ch0_prbs_match_int & ch1_prbs_match_int"

# Which file to replace 
set checkingFile /proj/dada/test.v

# Make a command fragment that performs the replacement on a supplied string
set replacementCmd [list string map [list $from $to]]

# For single file replacement 
fileutil::updateInPlace $checkingFile $replacementCmd
1 голос
/ 03 апреля 2019

Рассматривали ли вы использование Tcl для этого преобразования на месте, например, с помощью его команды [regsub]:

set x [regsub {(\([^)]*\))} $x ch0_prbs_match_int]
set x [regsub {(\([^)]*\))} $x ch1_prbs_match_int]

только исправить строку (уникально)

Предполагается, что переменная x содержит содержимое вашего файла и что заменяемые элементы строки могут быть однозначно идентифицированы путем отслеживания совпадающих пар скобок.

1 голос
/ 03 апреля 2019

Если у вас есть файл содержимое (или строка файла) в переменной, вы можете использовать команду string map, чтобы заменить одну подстроку другим текстом.

0 голосов
/ 03 апреля 2019

В BRE (базовое регулярное выражение) для буквальной обработки необходимо экранировать только шесть символов: ^$.*\[.
Кроме того, вам необходимо экранировать & в части REPLACEMENTs команда в sed, потому что & имеет особое значение совпадающей части в PATTERN.
В результате вы можете сказать что-то вроде:

#!/usr/bin/tclsh

set file {yourfilename}
exec /bin/sed -i {s/(ch0_prbs_match_dual3_int & ch0_prbs_match_dual2_int & ch0_prbs_match_dual1_int & ch0_prbs_match_int) & ( ch1_prbs_match_dual3_int & ch1_prbs_match_dual2_int & ch1_prbs_match_dual1_int & ch1_prbs_match_int);/ch0_prbs_match_int \& ch1_prbs_match_int;/} $file

, которыйизменяет $file как:

prbs_match_out <= ch0_prbs_match_int & ch1_prbs_match_int;
...