두 가지 다른 패턴(PAT1 및 PAT2) 사이의 미리 선택된 텍스트에서 패턴(x 뒤에 숫자)으로 시작하는 선택된 행을 인쇄하는 두 단계로 필요한 작업을 수행하는 UNIX 스크립트가 있습니다.
1) PAT1 및 PAT2가 있는 줄을 제외하고 두 가지 모드(PAT1 및 PAT2) 간에 미리 선택된 텍스트 -이 기사를 바탕으로
sed -n '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p;};}' file.txt > newfile.txt
2) 미리 선택된 텍스트에서 패턴(x 다음에 숫자)으로 시작하여 선택한 줄을 인쇄합니다.
sed -n '/^x [[:digit:]]*/p' newfile.txt > newfile2.txt
한 단계에서 동일한 결과를 얻을 수 있는 방법이 있습니까?
이 스크립트를 시도했지만 작동하지 않습니다(코드가 계속 차단됨).
sed -e '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p;};}' ; '/^x [[:digit:]]*/p' file.txt > newfile.txt
저는 Linux가 아닌 OSX에서 작업하고 있습니다.
답변1
첫 번째 작업을 약간 조정하면 됩니다 sed
.
sed -n '/PAT1/,/PAT2/{/^x [[:digit:]]*/p;}' file.txt > newfile.txt
- 다음과 같은 줄에 표시
PAT1
되지 않는 한 &를 제외하려고 시도할 필요는 없습니다 .PAT2
^x [0-9]
sed -n '/PAT1/,/PAT2/{/PAT1\|PAT2/!{/^x [0-9]*/p;};}' file.txt
PAT1
& 도 제외됩니다 .PAT2
다음은 아무 것도 수행하지 않는 것 같습니다.
sed -e '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p;};}' ; '/^x [[:digit:]]*/p'
^
첫 번째 명령( sed
)은 파일로부터 어떤 입력도 받지 않고 있으므로 standard input
키보드의 입력을 기다리고 있다는 것입니다.
세미콜론은 따옴표로 묶이지 않습니다. 이는 사용자가 제공하는 명령을 해석하는 데 사용되는 셸 구문의 일부를 구성합니다. 간단히 말해서 위 줄의 의미는 다음과 같습니다. execute a command named 'sed', then execute a command named '/^x [[:digit:]]*/p'
- 말이 안 됩니다.