일치하는 줄을 제외하고 일치하는 두 문자열 사이의 줄을 추출합니다.

일치하는 줄을 제외하고 일치하는 두 문자열 사이의 줄을 추출합니다.

아래는 내 파일입니다

$ cat README
login user1
run .profile
cd /u/opt
unzip -l zip file
copy files in zip file to .orig
unzip -o the zip file
cd /u/opt/install
./reqe21.sh
sqlplus admin/<password> @req.sql
logout

마지막으로 일치하는 문자열 사이에 줄이 필요합니다 unzip. 즉, logout원하는 출력은 다음과 같습니다.

cd /u/opt/install
./reqe21.sh
sqlplus admin/<password> @req.sql

답변이 필요해요.

  1. 시도해 보면 sed -n '/unzip -o /,/logout/p' README일치하는 행을 제외하지 않습니다.

따라서 다음과 같은 결과를 얻습니다.

unzip -o the zip file
cd /u/opt/install
./reqe21.sh
sqlplus admin/<password> @req.sql
logout

여기에 제공된 다른 솔루션을 시도했습니다.sed에서 범위 패턴과 일치하는 줄을 제외하는 방법은 무엇입니까?

그러나 원하는 결과가 나오지 않습니다. 아래를 참조하세요:

$ sed '1,/unzip/d;/logout/,$d' README
copy files in zip file to .orig
unzip -o the zip file
cd /u/opt/install
./reqe21.sh
sqlplus vrcadmin/<password> @req.sql
  1. sed마지막 과 마지막 unzip사이의 행 logout, 즉 이전에 공유된 원하는 출력을 가져오는 데 어떻게 사용할 수 있습니까 ?

답변1

이것은 단순히 sed가 가장 적합한 직업이 아닙니다. 이 시도:

$ tac file | awk '/unzip/{exit} f; /logout/{f=1}' | tac
cd /u/opt/install
./reqe21.sh
sqlplus admin/<password> @req.sql

또는 어떤 이유로 하나의 도구만 사용하려는 경우:

$ awk '/logout/{f=0} f{rec=rec $0 ORS} /unzip/{rec=""; f=1} END{printf "%s", rec}' file
cd /u/opt/install
./reqe21.sh
sqlplus admin/<password> @req.sql

답변2

입력을 반대로 하고 sed를 실행합니다. 범위 연산자를 사용하여 블록을 선택한 다음 동일한 정규식을 다시 적용하여 경계를 자릅니다.

$ tac |
sed -e '/logout/,/unzip/!d;//!d' |
tac
cd /u/opt/install
./reqe21.sh
sqlplus admin/<password> @req.sql

또는 다른 유틸리티 없이 결과를 원하는 경우. 우리는 예약된 공간(압축 해제 및 로그아웃으로 제한됨)에 블록을 계속 축적합니다. 압축 해제 줄이 다시 보이면 덮어쓰기가 남아 있는 것입니다. Th7s는 경계 블록을 등록 해제하기 위한 마지막 압축 해제를 제공합니다. 그런 다음 테두리를 자릅니다. 이것은 Posixly sed입니다.

sed -e '
  /\n/{
    P;/\n.*\n/D;d
  }
  /unzip/,/logout/!d
  H;/unzip/h;/logout/!d
  g;D
' file

답변3

tac filename| awk '/logout/{f=1}/unzip/{f=0}f && !/logout/'|tac

산출

cd /u/opt/install
./reqe21.sh
sqlplus admin/<password> @req.sql

관련 정보