sed는 키워드, 임의의 단어 및 알려진 기호를 사용하여 문자열을 일치시키고 형식을 다시 지정합니다.

sed는 키워드, 임의의 단어 및 알려진 기호를 사용하여 문자열을 일치시키고 형식을 다시 지정합니다.

쿼리를 작동 시키려고 몇 시간 동안 노력한 끝에 sed곧 포기하려고 합니다!

오래되고 문서화되지 않은 코드에 대한 프로토타입을 생성할 목적으로 소스 코드에서 다음 문자열을 추출했습니다. 예를 들어:

function foo(bar=1);

비슷한 결과를 얻고 싶습니다.

function foo(
    bar=1)

function다음으로 시작하는 모든 줄 과 임의의 영숫자(및 - 및 _) 단어를 일치시키고 개행 문자와 탭을 추가하고 싶습니다 sed.

내 문제는 sed가 기본적으로 욕심이 많고 sed정규식이 욕심이 많기 때문에 첫 번째 줄 바꿈 뒤에 줄 바꿈을 추가할 수 없다는 것입니다.(

따라서 다음과 같이 하드코딩이 작동합니다.

echo 'function foo(bar=true)' | sed 's:\(function foo(\)\(.*\):\1\n\t\2:g'

이것은 나에게 예상되는 결과를 제공합니다.

function foo(
    bar=true)

문자 뒤에 개행 문자를 추가하여 다음과 같이 수정할 수 있습니다 (.

echo 'function foo(bar=true)' | sed 's:\(function.*(\)\(.*\):\1\n\t\2:g'

이것은 이전과 동일한 예상 결과를 제공합니다. 매개 변수의 기본값으로 배열을 포함하는 코드에서 함수에 도달할 때까지 이것은 탐욕스러운 정규 표현식이 나를 혼란스럽게 하는 부분입니다.

echo 'function foo(bar=array())' | sed 's:\(function.*(\)\(.*\):\1\n\t\2:g'

이는 실제로 다음을 제공합니다.

function foo(bar=array(
    ))

욕심이 많으면 끝에 개행과 탭이 추가됩니다.마지막 (그리고 처음은 아닙니다. sed불행하게도아니요모든 문제를 즉각적으로 해결할 수 있는 탐욕스럽지 않은 정규 표현식을 지원합니다.

그래서 다음과 같은 정규식을 만들어 보았지만 아무런 결과도 얻지 못했습니다.

  • 's:\(function [\w+]\)\(.*\):\1\n\2:g'첫 번째(
  • :alnum:클래스를 사용하여 단어를 일치 시켜 보세요 .
  • sed동일한 교체를 수행하는 더 친숙한 방법이지만 패턴 [A-Za-z0-9_-]의 여러 문자와 일치하도록 만드는 방법을 파악하기 어렵기 때문에 단어를 첫 번째로 가져온 (다음 두 번째 반환에서 나머지를 가져옵니다.

쿼리에서 이러한 문자 클래스가 무시되고 아이디어가 부족한 것 같습니다.

탐욕스럽지 않게 할 수 없기 때문에 sed형식의 문자열을 어떻게 일치시킬 수 있습니까?

KnownKeyword SomethingRandomAlphaNumerical-_(SomethingElse())

문자열로 변환하면 첫 번째 (,, 이후의 개행 문자 다음에 다음과 같이 표시됩니다.

KnownKeyword SomethingRandomAlphaNumerical-_(
SomethingElse())

내가 어디서 잘못됐나요? 어떤 모델이 이를 달성할 수 있나요?

답변1

점을 "모든 문자"로 사용하지 말고 .부정 문자 일치를 사용하십시오 [^(]. 따라서 정규식은 다음과 같습니다.

$ echo 'function foo(bar=array())' | sed 's:\(function[^(]*(\)\(.*\):\1\n\t\2:g'

function foo(
    bar=array())

부정 일치는 첫 번째 문자 뒤의 괄호 안에 있는 문자를 제외한 모든 문자와 일치합니다 ^(개행 문자 제외). 이는 a가 [^(]"not"과 일치하는 것으로 이해될 수 있음 을 의미합니다 (. 그런 다음 *가능한 한 많이 반복한다는 의미인 an도 있습니다 . 이는 여전히 탐욕스럽기는 하지만 일치하지 않습니다 (. 즉, 다음까지의 모든 문자와 일치합니다 (. 이 기술은 .*제한적인 특성을 할당하여 탐욕을 제한합니다.

답변2

새 줄과 탭을 추가하기 위해 GNU를 사용하여 함수, 하위 첫 번째 여는 괄호로 시작하는 줄과 일치합니다.sed

$ sed '/^function/s/(/&\n\t/' input_file
function foo(
    bar=array())

답변3

요구 사항을 정확하게 충족하기 위해 함수 식별자[1]는 (영숫자, 밑줄 또는 하이픈) 문자입니다.

sed -E 's:function[[:blank:]]+[[:alnum:]_-]+\(:&\n\t:' file`

아무 것도 캡처할 필요가 없습니다. "function"을 여는 괄호에 일치시킨 다음 &대체 문자열에서 일치하는 텍스트를 인용하는 데 사용하면 됩니다.

[1] 많은 언어에서 식별자를 제한하지만 첫 번째 문자는 문자나 밑줄로 제한됩니다.

관련 정보