다음 항목이 포함된 파일이 있다고 가정해 보겠습니다.
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