Sed: 다음 줄로 넘어가는 패턴을 찾아 바꾸기

Sed: 다음 줄로 넘어가는 패턴을 찾아 바꾸기

패턴을 찾아 바꾸고 싶지만 패턴이 다음 줄로 넘어가기 때문에 이를 처리할 방법을 찾아야 합니다.

다음과 같은 것 :

....tr("Changes to output mappings will be deleted. "
"There is no undo available. Do you want to continue?"));

다음과 같은 것이 되다

...."Changes to output mappings will be deleted. "
"There is no undo available. Do you want to continue?");

(...이전 코드입니다)

지금까지 내 코드는 다음과 같습니다(단일 줄에서는 작동하지만 래핑된 텍스트/코드에서는 작동하지 않음).

sed -i 's/tr(\([^)]*\))/\1/I' $file_t

어떻게 해야 하나요?

답변1

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에게 이 줄이 끝났음을 알려줍니다. 이것이 발생하지 않으면 end가 없다는 의미이며 )다음 줄은 ()에서 읽혀 지고 sed는 label ( ) N로 다시 분기되어 교체를 다시 시도합니다. 를 찾기에 충분한 행을 읽을 때까지 이 작업을 반복합니다 .aba)

예를 들어, 다음은 tr(...)1줄, 2줄, 3줄로 구성된 파일입니다.

$ 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(...)

or 만 바꾸고 tr대체하지 않도록 하려면 단어 경계에서 시작하는지 확인해야 합니다 . GNU sed(Linux)의 경우 단어 경계는 다음과 같이 표현됩니다 .PtrStrtr\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

관련 정보