Для случая, когда команды tr (
всегда распределите по двум строкам, попробуйте:
$ sed '/tr(/N; s/tr(\([^)]*\))/\1/I' "$file_t"
...."Changes to output mappings will be deleted. "
"There is no undo available. Do you want to continue?");
Единственное изменение здесь - добавление / tr (/ N
. Для любой строки, которая соответствует tr (
, это читается в следующей строке и добавляет его в пространство шаблонов ( N
).
Чтобы изменить файл на месте, используйте -i
:
sed -i.bak '/tr(/N; s/tr(\([^)]*\))/\1/I' "$file_t"
Если это возможно что команды tr (...)
могут появляться в одной строке, на двух или более чем двух строках, нам нужно немного изменить логику:
sed '/tr(/{ :a; s/tr(\([^)]*\))/\1/I; t; N; ba}' filename
Это ищет строки, содержащие ] tr (
. Для любых таких строк выполняются команды в фигурных скобках, {...}
. Для этих строк подстановка сначала выполняется только в этой строке. Если подстановка происходит, то команда t
сообщает sed, что мы завершили эту строку.Если этого не произошло, то есть не было закрытия )
, то следующая строка считывается в ( N
), и sed выполняет обратный переход к метке a
( ba
) и повторная попытка замены. Это повторяется до тех пор, пока не будет прочитано достаточно строк, чтобы найти )
.
В качестве примера приведем файл с tr (...)
, занимающий одну, две и три строки:
$ cat filename
tr("abc");
....tr("Changes to output mappings will be deleted. "
"There is no undo available. Do you want to continue?"));
tr("one
two
three");
Вот результат:
$ sed '/tr(/{ :a; s/tr(\([^)]*\))/\1/I; t; N; ba}' filename
"abc";
...."Changes to output mappings will be deleted. "
"There is no undo available. Do you want to continue?");
"one
two
three";
tr (...)
и Ptr (...)
Чтобы убедиться, что мы заменяем только tr
, а не Ptr
или ] Str
, нам нужно убедиться, что tr
начинается на границе слова. В GNU sed (Linux) граница слова обозначается \ b
:
sed '/\btr(/{ :a; s/\btr(\([^)]*\))/\1/I; t; N; ba}' filename
Используя BSD (OSX) sed, может работать следующее :
sed '/[[:<:]]tr(/{ :a; s/[[:<:]]tr(\([^)]*\))/\1/I; t; N; ba}' filename