Избавьтесь от заброшенных процессов SSH

Для случая, когда команды 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

2
11.02.2016, 17:35
0 ответов

Теги

Похожие вопросы