서로 다른 두 패턴 사이에서 미리 선택된 텍스트의 패턴으로 시작하는 줄 선택

서로 다른 두 패턴 사이에서 미리 선택된 텍스트의 패턴으로 시작하는 줄 선택

두 가지 다른 패턴(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'- 말이 안 됩니다.

관련 정보