두 문자열 사이에 텍스트 인쇄 - 두 번째 발생 무시

두 문자열 사이에 텍스트 인쇄 - 두 번째 발생 무시

여러 단계가 포함된 지침 파일이 있습니다. 그래픽 환경 없이 셸에서 필요한 개별 단계를 보고 싶습니다. 말씀하신 대로 지금 제가 하고 있는 일은알레모어, sed보려는 단계 번호와 다음 단계 번호 내의 내용을 추출하는 데 사용됩니다.

cat file | sed -n '/12/,/13/p'

12단계: 다른 것
commands to execute
13단계: 다른 것

내가 원하는 대로 정확하게 수행하고 싶은 것은 마지막 줄을 생략하는 것입니다. sed즉, 첫 번째 항목부터 두 번째 항목까지 인쇄하는 것입니다. 두 번째 줄을 피하고 출력에서 ​​마지막 줄을 제거하고 인쇄하고 싶습니다.

12단계: 몇 가지 사항
commands to execute

이를 달성하려면 명령을 어떻게 수정해야 합니까? 추가 명령, 파이프 등을 갖고 싶지 않습니다. 가능하다면 "하나는 인쇄하고 다른 하나는 생략"과 같이 첫 번째 패턴을 두 번째 패턴과 구별하기 위해 사용법을 수정합니다 sed(또는 마찬가지로 간단히 다른 도구(예: )를 사용 ).grep

그리고 명령어도 최대한 간단하게 만들어서 쉽게 기억하고, 짧은 시간 안에 써낼 수 있도록 하고 싶습니다.

답변1

Don_crissti가 댓글로 해결책을 제시했습니다. (그의 문서를 따르겠습니다.)명명 규칙):

sed -n '/12/,/13/{/13/!p}' UUoC.txt

그러면 12파일의 1행부터 1행까지의 모든 행이 선택되고 일치하지 않는 한 인쇄됩니다(그게 전부입니다).13UUoC.txt13/13/!p

또 다른 방법은 head다음을 사용하여 마지막 줄을 삭제하는 것입니다.

sed -n '/12/,/13/p' file.txt | head -n -1

답변2

don_crissti와 terdon이 모든 노력을 기울였습니다. 저는 이 질문을 보고 타이핑/암기를 더 줄이고 유연성을 추가하기 위해 쉘 기능을 사용할 것을 제안하고 싶었습니다. 또한 잘못된 긍정을 피하기 위해 입력하는 동안 일부 정규식을 자유롭게 조정할 수 있었습니다.

쉘 함수는 다음과 같습니다.

function step () (
  STEPS=./steps.txt
  start=$1
  stop=$((start+1))
  sed -n "/^Step $start:/,/^Step $stop:/ { /^Step $stop:/ !p }" $STEPS
)

step분명히 문서의 표현에 따라 원하는 대로 이름을 지정할 수 있습니다. 제 생각엔 직관적인 것 같습니다. 이 방법으로 변수를 실제 지시문 파일의 전체 경로로 조정하면 STEPS이를 기억하거나 입력할 필요가 없습니다. -- 명령줄에 있는 파일의 경로입니다. STEPS, 시작 및 중지 변수로 셸의 네임스페이스를 오염시키고 싶지 않았기 때문에 함수에서 서브셸(중괄호 대신 본문 주위에 괄호)을 사용하도록 만들었습니다. 서브셸을 만드는 것이 세 개의 새 변수를 만드는 것보다 더 번거롭다면 두 번째 대괄호 세트를 중괄호로 자유롭게 변경하세요.

나는 don과 terdon에 사용하는 정규식으로 두 가지 기본 작업을 수행합니다.

  1. 경기가 라인의 시작 부분에서 시작되도록 강제하고,
  2. "Step"이라는 단어와 숫자, 콜론을 포함해야 합니다.

commands to execute지시문 파일에 숫자가 포함되어 정규식 불일치가 더 간단해질 수 있다고 생각했기 때문에 이 두 가지 작업을 모두 수행했습니다 .

내가 사용하는 "Devil's Advocate" steps.txt 파일은 다음과 같습니다.

Step 1: one
commands to execute
Step 2: two
commands to execute
commands to execute
Step 3: three
commands to execute skip to Step 7
Step 4: four
commands to execute not step 5
commands to execute
commands to execute
commands to execute
Step 5: five
commands to execute
commands to execute
commands to execute skip to Step 6:
commands to execute
Step 6: six
commands to execute
Step 7: seven
commands to execute
Step 8: eight
commands to execute
Step 9: nine
commands to execute
Step 10: ten
commands to execute
Step 11: eleven
commands to execute
Step 12: something
commands to execute
commands to execute
Step 13: something else
commands to execute

...그리고 테스트 하니스의 결과(출력은 step 14비어 있음):

$ for step in $(seq 1 14); do step $step; echo; done
Step 1: one
commands to execute

Step 2: two
commands to execute
commands to execute

Step 3: three
commands to execute skip to Step 7

Step 4: four
commands to execute not step 5
commands to execute
commands to execute
commands to execute

Step 5: five
commands to execute
commands to execute
commands to execute skip to Step 6:
commands to execute

Step 6: six
commands to execute

Step 7: seven
commands to execute

Step 8: eight
commands to execute

Step 9: nine
commands to execute

Step 10: ten
commands to execute

Step 11: eleven
commands to execute

Step 12: something
commands to execute
commands to execute

Step 13: something else
commands to execute

관련 정보