>

다음 문제를 해결하도록 도와주세요. \ 문자를 모두 제거   n  모든 파일의 Test_Macro에서. 아래 예를 참조하십시오 :

Fil1.txt

Test_Macro(abc, def, "\n string1 string2 \n test string",
       "test string2 \n");
// Some code or text
Test_Macro(asdsadas, "test String1");
// Some code...

dir1/File2.txt

Test_Macro(abc, def, "\n string1 string2 \n test string",
       "test string2 \n",
        123456);
// Some code or text
Test_Macro(asdsadas, "test String1");
// Some code...

예상 결과 :

File1.txt

Test_Macro(abc, def, " string1 string2 test string",
   "test string2 ");
// Some code or text
Test_Macro(asdsadas, "test String1");
// Some code...

dir1/File2.txt

Test_Macro(abc, def, " string1 string2  test string",
   "test string2 ",
    123456);
// Some code or text
Test_Macro(asdsadas, "test String1");
// Some code...

도움이나 제안은 대단히 감사합니다. 스크립트를 작성하려고합니다. 다양한 유형의 파일과 많은 매크로가 있기 때문입니다. 미리 감사드립니다!

Test_Macro에 대한 인수는 다른 매크로에 대한 중첩 호출을 가질 수 있으며 문자열 안에 문자가있을 수 있습니다.

  • 답변 # 1

    파일 1 :

    $ sed '/Test_Macro/{N;$!N;s/.*\(Test_Macro[^)]*);\).*/\1/;p;};d' abc.txt
    Test_Macro(abc, def, "\n string1 string2 \n test string",
           "test string2 \n");
    Test_Macro(asdsadas, "test String1");
    
    

    파일 2 :

    $ sed '/Test_Macro/{N;$!N;s/.*\(Test_Macro[^)]*);\).*/\1/;p;};d' abc2.txt
    Test_Macro(abc, def, "\n string1 string2 \n test string",
           "test string2 \n",
            123456);
    Test_Macro(asdsadas, "test String1");
    
    

    ps, 모든 줄 바꿈을 제거하는 가장 쉬운 방법은;

    echo -e "line \n break" | tr "\n" " "
    
    

    줄 바꿈없이;

    $ sed ':a;N;$!ba;s/[^;]\n[ ]*/ /g;' abc2.txt  | grep Test_Macro
    Test_Macro(abc, def, "\n string1 string2 \n test string" "test string2 \n" 123456);
    Test_Macro(asdsadas, "test String1");
    
    

    "\ n"은 없지만 줄 바꿈이 있습니다 ... lol

    $ sed '/Test_Macro/{N;$!N;s/[ ]*\\n//g;s/.*\(Test_Macro[^)]*);\).*/\1/;p;};d' abc2.txt
    Test_Macro(abc, def, " string1 string2 test string",
           "test string2",
            123456);
    Test_Macro(asdsadas, "test String1");
    
    

    "\ n"문자열 (및 후행 공백) 만 제거;

    $ sed ':a;N;$!ba;s/\\n[ ]*//g;' abc2.txt
    Test_Macro(abc, def, "string1 string2 test string",
           "test string2 ",
            123456);
    // Some code or text
    Test_Macro(asdsadas, "test String1");
    // Some code...
    
    

    다시 한 번 (마지막으로) ... Test_Macro 함수에있을 때 문자열 "\ n"을 제거하지만 외부에 있지 않고 줄 바꿈을 제거하지 않습니다.

    $ sed '{N;/Test_Ma/{s/[ ]*\\n//g;};s/\(Test_Macro[^)]*);\)/\1/};' abc2.txt
    Test_Macro(abc, def, " string1 string2 test string",
           "test string2",
            123456);
    // Some code or text \n
    Test_Macro(asdsadas, "test String1");
    // Some code...
    
    

    업데이트;

    $ sed '{:a;N;/Test_Ma/{s/[ ]*\\n//g;};ta};' abc2.txt 
    Test_Macro(abc, def, " string1 string2 test string",
           "test string2",
           "test string2",
           "test string2",
           "test string2",
           "test string2",
           "test string2",
           "test string2",
           "test string2",
           "test string2",
           "test string2",
           "test string2",
            123456);
    // Some code or text \n
    // Some code or text \n
    // Some code or text \n
    // Some code or text \n
    // Some code or text \n
    // Some code or text \n
    // Some code or text \n
    // Some code or text \n
    // Some code or text \n
    // Some code or text \n
    Test_Macro(asdsadas, "test String1");
    // Some code...
    
    

  • 답변 # 2

    "정규 표현식은 계산할 수 없습니다"라는 문구가 있습니다.

    이 경우에는 많은 '단순한'유닉스 도구가 정규식을 기반으로하기 때문에 중요합니다. 여기서 계산은 Test_Macro에 대한 인수 내에서 사용될 수있는 열기 및 닫기 괄호 ( '둥근 괄호')를 계산하는 것입니다.

    Test_Macro에 대한 호출이 괄호 안에n있는 경우 쉬운 트릭이 있습니다. 모든 ) 를 먼저 변경  줄 바꿈 문자를 사용하고 그 반대의 경우도 마찬가지입니다. 그런 다음 Test_Macro를 포함하지 않는 모든 행을 삭제하고 Test_Macro까지 모든 것을 제거하십시오. 이 시점에서 처리 된 File2.txt의 일부는 다음과 같습니다.

    Test_Macro(abc, def, " string1 string2 test string",)   "test string2 ",)    123456
    
    

    이제 ) 를 변환해야합니다  뒤. 이 시점에서 몇 가지 옵션이 있습니다. 여분의 공간을 동시에 제거하기 위해 sed를 사용하는 것이 좋습니다. 우리는 또한 ) 에 다시 추가해야합니다  그리고 아마도 ;

    이걸 합치면

    find . -type f | while read -r fn
    do
       < "$fn" tr ')\n' '\n)' | sed -n 's/.*Test_Macro(/Test_Macro(/p' | \
         sed 's/) */ /g;s/$/);/'
    done
    
    

    Test_Macro에 대한 인수에 중첩 된 괄호가 포함되어있을 가능성이있는 경우 단순히 패턴 일치가 아닌 입력을 구문 분석해야하므로 크게 더 큰 총을 가져와야합니다. 이론적으로 중첩 수준을 제한 할 수있는 경우 패턴 일치를 수행 할 수 있지만 실제로는 매우 빠르게 복잡해져이 방법을 사용하지 않아야합니다. 파이썬과 같은 언어에 대한 구문 분석기 프레임 워크가 있거나 lex와 같은 도구 위에 도구를 빌드 할 수 있습니다.

  • 답변 # 3

    편집 :이 답변은 질문이 수정되기 전에 준비되었습니다. 질문의 원래 형태는 다음과 같습니다.

    와이즈 비즈 정규 표현식은 계산할 수 없지만 Sed는 반복 할 수 있습니다.

    다음은

    When I tried to find some pattern using "grep", it only prints first line. But I want till end of the bracket.

    가 포함 된 모든 줄에서 가져 오는 Sed 스 니펫입니다.  중첩 된 괄호가있는 경우에도 :

    Test_Macro
    
    

    한 줄짜리 라이너로 변환하면 다음과 같이 보입니다 :

    #n
    /Test_Macro/{
      p;
      :rep
      s/([^()]*)//;
      trep
      /^[^(]*$/d;
      h;
      n;
      p;
      x;
      G;
      brep
    }
    
    

    입력과 출력은 다음과 같습니다 :

    sed -n -e '/Test_Macro/{p;:rep' -e 's/([^()]*)//;trep' -e '/^[^(]*$/d;h;n;p;x;G;brep' -e '}'
    
    
    $ cat temp Test_Macro(abc, def, "\n string1 string2 \n test string", "test string2 \n"); // Some code or text Test_Macro(asdsadas, "test String1"); // Some code... $ sed -n -e '/Test_Macro/{p;:rep' -e 's/([^()]*)//;trep' -e '/^[^(]*$/d;h;n;p;x;G;brep' -e '}' temp Test_Macro(abc, def, "\n string1 string2 \n test string", "test string2 \n"); Test_Macro(asdsadas, "test String1"); $

관련 자료

  • 이전 permissions - 심볼릭 링크의 대체 옵션 (ln)
  • 다음 linux - gnu 화면에서 하나의 바로 가기 만 사용하여 새 창을 여는 방법은 무엇입니까?