파일이 있고 파일 데이터에 여러 줄에 한 단어만 있고 이 상황이 발생하면 다음 줄을 현재 줄로 인쇄하고 싶습니다.
조언 좀 얻을 수 있을까요
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'
설명하다:
grep ...
- "모듈"로 시작하는 행 필터링
- 찾은 줄과 찾은 각 줄 다음의 줄을 반환합니다. (
-A 1
) 출력:
module module_name1(i1,i2,i3)
statement1;
--
module
module_name2(i1,i2,i3) #observe here
statement1;
--
...
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)