Linux 명령을 사용하여 단어를 검색하는 스크립트

Linux 명령을 사용하여 단어를 검색하는 스크립트

파일이 있고 파일 데이터에 여러 줄에 한 단어만 있고 이 상황이 발생하면 다음 줄을 현재 줄로 인쇄하고 싶습니다.

조언 좀 얻을 수 있을까요

grep -E "module" filename   # to fetch the line which contains the "module"

모듈 뒤에 문자열이 없으면 두 번째 줄은 모듈 줄의 확장으로 처리됩니다.

module module_name1(i1,i2,i3)
statement1;
statement2;
statement3;
   .
   .
statement;

module 
module_name2(i1,i2,i3)   #observe here
statement1;
statement2;
statement3;
   .
   .
statement;

module module_name3(i1,i2,i3)
statement1;
statement2;
statement3;
   .
   .
statement;

module module_name4(i1,i2,i3)
statement1;
statement2;
statement;
   .
   .
statement;

예상 출력

module_name1(i1,i2,i3)
module_name2(i1,i2,i3)
module_name3(i1,i2,i3)
module_name4(i1,i2,i3)

내가 얻는 결과는 무엇인가?

module_name1(i1,i2,i3)
                         #missing
module_name3(i1,i2,i3)
module_name4(i1,i2,i3)

다음 줄을 현재 줄로 간주하고 싶은 위치가 누락되었습니다.

답변1

$ perl -ne 'if (s/^module\s*//) { $_ = <> if ($_ eq ""); s/\).*/)/; print }' file
module_name1(i1,i2,i3)
module_name2(i1,i2,i3)
module_name3(i1,i2,i3)
module_name4(i1,i2,i3)

이 perl one-liner는 각 입력 줄( -n옵션)을 읽고 줄 시작 부분에서 "module"이라는 단어와 후행 공백을 제거하려고 시도합니다.

성공하면 현재 행이 비어 있는지 확인합니다. 그렇다면 다음 줄( $_ = <>)을 읽어보세요. 어느 쪽이든 첫 번째 )문자( ) s/\).*/)/뒤의 모든 내용을 제거하고 수정된 줄을 인쇄합니다.

작업이 실패 하면 s/^Module\s*//아무 것도 인쇄되지 않고 스크립트는 다음 입력 줄로 계속 진행됩니다.

답변2

이 같은:

grep -A 1 "^module" < filename | sed -n -e 's/^\(module \)*\(.*(.*)\).*$/\2/p'

설명하다:

  1. grep ...
  • "모듈"로 시작하는 행 필터링
  • 찾은 줄과 찾은 각 줄 다음의 줄을 반환합니다. ( -A 1) 출력:
module module_name1(i1,i2,i3)
statement1;
--
module
module_name2(i1,i2,i3)   #observe here
statement1;
--
...
  1. sed ...
  • -n: 인쇄하지 않음(정숙 모드)
  • -e: 스크립트는 다음과 같습니다...
  • s/^\(module \)*\(.*(.*)\).*$/\2/p: 스크립트
    • s/.x./.y./.a.: 태그를 태그 .x..y.대체/교체하고 .a.매개변수를 따릅니다.
      • .x.^\(module \)*\(.*(.*)\).*$:
        • 줄의 시작(접두사)에서 module토큰( )을 검색할지 여부입니다. 이것은 첫 번째로 표시된 패턴입니다.^*\(...\)
        • 두 번째 패턴은 \(...\)임의의 문자 .*(귀하의 경우 모듈 이름)와 그 뒤의 대괄호 표시 (...)(백슬래시 없음)로 구성됩니다. 귀하의 경우 이는 모듈 매개변수입니다. 대괄호 사이의 모든 문자.*
        • .*줄 끝까지 모든 문자가 이어집니다.$
      • .y.\2
        • 괄호 안의 두 번째 모드
      • .a.p
        • p강제로 인쇄할 때 사용( -n옵션 아님) 되어 .y.인쇄됩니다 .

산출:

module_name1(i1,i2,i3)
module_name2(i1,i2,i3)
module_name3(i1,i2,i3)
module_name4(i1,i2,i3)

답변3

더 짧게:

$ grep -o 'module_name[0-9].*' file
module_name1(i1,i2,i3)
module_name2(i1,i2,i3)
module_name3(i1,i2,i3)
module_name4(i1,i2,i3)

관련 정보