unix 명령에서 줄 끝까지 "[0-9]" 이후의 모든 내용을 추출합니다.

unix 명령에서 줄 끝까지 "[0-9]" 이후의 모든 내용을 추출합니다.

다음 항목이 포함된 파일이 있다고 가정해 보겠습니다.

5. variable1:
10. variable7:
230. variable21803:

"5" 등을 사용하지 않고 모든 변수를 출력으로 갖고 싶습니다. 내가 시도한 것은

grep -Po '(?<=^[0-9] )[.\n]+

그러나 결과가 반환되지 않습니다. 저는 유닉스를 처음 접했기 때문에 도움을 주시면 대단히 감사하겠습니다.

다음은 앞에 공백이 있는 업데이트된 테스트입니다.

    ranodm text 
   1. variable1:
   2. variable10:
   3. variable302:

답변1

grep유틸리티는 인라인 편집에는 적합하지 않습니다. 표준 용도는 특정 정규식이나 문자열과 일치하는 줄을 추출하는 것입니다. sed이러한 유형의 편집에는 편집기가 더 일반적으로 사용됩니다.

다음 명령은 다음을 sed사용하여 파일의 각 줄에서 첫 번째 공백 문자 앞에 있는 모든 항목을 삭제하는 방법을 보여줍니다.

$ sed 's/[^ ]* //' file
variable1
variable7
variable21803

이 표현식은 s/[^ ]* //공백이 없는 0개 이상의 문자와 그 뒤에 공백이 오는 것과 일치합니다. 그런 다음 일치하는 하위 문자열을 아무것도 없는 것으로 대체합니다(즉, 제거합니다).

줄 시작 부분의 정수와 공백 앞에 점이 일치해야 하는 경우 다음을 수행할 수 있습니다.

$ sed 's/^[[:digit:]]*\. //' file
variable1
variable7
variable21803

이는 줄 시작 부분의 0개 이상의 숫자와 일치하고 그 뒤에 점과 공백이 옵니다. 일치하는 항목이 있으면 삭제됩니다.


업데이트된 질문은 각 행의 양쪽 끝에서 데이터를 제거하는 것과 관련된 완전히 다른 것을 요구합니다.

여러 가지 방법으로 이 작업을 수행할 수 있습니다. 아래 명령은 질문의 데이터에 따라 줄에서 마지막 공백까지 첫 번째 비트를 제거한 다음 로 :끝나는 모든 줄에서 마지막 비트를 제거하는 방법을 보여줍니다.:

$ sed '/:$/ { s///; s/.* //; }' file
    ranodm text
variable1
variable10
variable302

또는 처음에 임의의 텍스트를 원하지 않는 경우:

$ sed -n '/:$/ { s///; s/.* //p; }' file
variable1
variable10
variable302

답변2

Raku(이전 Perl_6) 사용

raku -e 'lines.comb(/ variable \d+ /).join("\n").put;' 

입력 예:

5. variable1:
10. variable7:
230. variable21803:

    ranodm text 

   1. variable1:
   2. variable10:
   3. variable302:

예제 출력:

variable1
variable7
variable21803
variable1
variable10
variable302

위의 내용은 Perl 계열 프로그래밍 언어 중 하나인 Raku로 코딩된 솔루션입니다. 간단히 말해서 Raku는 정규식 일치자를 comb사용하는 루틴을 제공합니다. /…/명령줄에서 호출하면 -ed가 lines읽고 comb(공백은 중요하지 않음) variable \d+패턴을 찾고 일치하는 항목이 반환됩니다.

join("\n")모든 일치 항목을 한 행에 반환하려면 해당 호출을 제거하세요.

raku -e 'lines.comb(/ variable \d+ /).put;' file
variable1 variable7 variable21803 variable1 variable10 variable302

물론, 친숙한 대체 연산자( 이 스레드의 다른 곳에 게시된 s///것과 같은 )를 사용하는 솔루션을 포함하여 Raku에서 사용할 수 있는 다른 솔루션이 있습니다. sed줄 간격을 유지하는 또 다른 Raku 솔루션은 다음과 같습니다.

raku -ne 'put m:g/ [variable \d+] /;' file
variable1
variable7
variable21803



variable1
variable10
variable302

https://raku.org

관련 정보