sed에서 여러 줄 및 한 줄 일치 항목을 모두 교체합니다.

sed에서 여러 줄 및 한 줄 일치 항목을 모두 교체합니다.

/g동일한 패턴( )을 여러 번 교체하고 싶습니다 . 패턴은 한 줄에 나타날 수도 있고 여러 줄(2+)에 걸쳐 나타날 수도 있습니다.

예를 들어, 나는 바꾸고 싶다

EXPECT_EQ(50, var1);
EXPECT_EQ(10, 
var2);
EXPECT_EQ(20,
an_expression
_that_takes
_multiple_lines);

비슷한 것

EXPECT_EQ(var1, 50);
EXPECT_EQ(var2, 
0);

EXPECT_EQ(an_expression
_that_takes
_multiple_lines,
20);

문제는

sed -E 's/EXPECT_EQ\(([0-9]+), (.*)\);/EXPECT_EQ(\2, \1);/g' file.txt

원하는 두 번째 일치 항목에 행이 2개 있으므로 예제의 첫 번째 행만 업데이트됩니다.

행 수에 관계없이 모든 일치 항목을 바꾸는 방법이 있습니까? 그것은 마치https://regex101.com/r/QmHCyo/1하지만 sed를 사용하세요.

결과 문자열의 공백이나 개행은 중요하지 않습니다. 나중에 자동으로 복구되므로 어떤 형식이든 가능합니다.

답변1

GNU sed확장 정규식이 활성화된 스트림 편집기 유틸리티를 사용하면 -E다음을 수행할 수 있습니다.

sed -Ee '
  /^EXPECT_EQ\(.*\);$/!{
    $!N;H;z;x;D
  }
  s/\(([^,]+)(,\s*)(.*)\);$/(\3\2\1);/
' file

결과:-

EXPECT_EQ(var1, 50);
EXPECT_EQ(var2, 
10);
EXPECT_EQ(an_expression
_that_takes
_multiple_lines,
20);

대괄호가 중첩되지 않고 특정 함수 Expect_eq가 수정되고 있다고 가정합니다.

목표는 브래킷이 균형을 이룰 때까지 패턴 공간에 축적되는 것입니다. 그런 다음 쉼표와 선택적 공백으로 구분된 두 매개변수를 뒤집습니다.

답변2

-E다음에 는 GNU sed를 사용하십시오 -z.

$ sed -Ez 's/(\(\s*)([^),]+\S)(\s*,\s*)([^),]+\S)(\s*\))/\1\4\3\2\5/g' file
EXPECT_EQ(var1, 50);
EXPECT_EQ(var2,
10);
EXPECT_EQ(an_expression
_that_takes
_multiple_lines,
20);

관련 정보