sed 파일의 특정 단락 사이의 문자열 편집

sed 파일의 특정 단락 사이의 문자열 편집

a.txt라는 파일이 있습니다. 그리고 그 안에는 다음과 같은 내용이 담겨 있습니다. 각 기능 사이에 몇 줄이 있는지 알 수 없습니다.

function a(
line 1;
line 2;
line ...;
properties pro = "test";
)

function b(
line 1;
line 2;
line ...;
properties pro= "test";
)

function c(
properties pro= "test";
)

편집하고 싶어요

function b(
line 1;
line 2;
line ...;
properties pro= "test";
)

다음에

function b(
line 1;
line 2;
line ...;
properties pro= "replace";
)

sed 또는 awk와 같은 한 줄 명령을 사용할 수 있습니까?

답변1

함수가 표시된 대로 하나 이상의 빈 줄로 단락으로 구분된 경우 빈 레코드 구분 기호와 함께 awk를 사용할 수 있습니다. 특히 GNU awk의 경우:

$ gawk '
    BEGIN{RS=""} 
    /^function b/ {sub(/properties pro= "test"/,"properties pro= \"replace\"")}
    {printf "%s%s", $0, RT}
' a.txt
function a(
line 1;
line 2;
line ...;
properties pro = "test";
)

function b(
line 1;
line 2;
line ...;
properties pro= "replace";
)

function c(
properties pro= "test";
)

GNU가 아닌 awk도 사용할 수 있지만 구분 기호는 GNU 전용 ORS이므로 고정 출력 레코드 구분 기호를 설정해야 합니다 .RT

Perl은 옵션을 통해 유사한 단락 모드를 제공합니다 -00.

sed를 사용하면 정규식 주소 범위를 사용하여 대체 범위를 제한할 수 있습니다.

$ sed '/^function b/,/^)$/s/properties pro= "test"/properties pro= "replace"/' a.txt
function a(
line 1;
line 2;
line ...;
properties pro = "test";
)

function b(
line 1;
line 2;
line ...;
properties pro= "replace";
)

function c(
properties pro= "test";
)

그러나 귀하의 "언어"에서 구문적으로 중립적일 수 있는 것(예: 빈 줄)을 명심하십시오.이내에함수)는 이 접근 방식을 깨뜨릴 수 있습니다. 이러한 이유로 정규식은 이러한 작업에 적합하지 않은 선택인 경우가 많습니다.

관련 정보