여러 단계가 포함된 지침 파일이 있습니다. 그래픽 환경 없이 셸에서 필요한 개별 단계를 보고 싶습니다. 말씀하신 대로 지금 제가 하고 있는 일은알레모어, 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행까지의 모든 행이 선택되고 일치하지 않는 한 인쇄됩니다(그게 전부입니다).13
UUoC.txt
13
/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에 사용하는 정규식으로 두 가지 기본 작업을 수행합니다.
- 경기가 라인의 시작 부분에서 시작되도록 강제하고,
- "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