특정 라인의 일부 인쇄

특정 라인의 일부 인쇄

파일을 읽고 다음을 포함하는 모든 줄을 인쇄하고 싶습니다.

## DF <anything> 

아니면 다음으로 끝나나요?

<something> # DF <anything>

DF그런 다음 다음에서 인쇄를 시작합니다.

여기 몇 가지 예가 있어요

  local lbpos=21    # DF [LBPOS]  Label Position
  local ktg="PILE"  # DF [KTG]    Category
  ## DF [KARG]   Control Argument
  Some text
  printf '%s\n' "$@"  \
      | while IFS="" read -r lnp; do  # DF [LNP]  Line Input
  More text 

결과

DF [LBPOS]  Label Position
DF [KTG]    Category
DF [KARG]   Control Argument
DF [LNP]  Line Input

답변1

sed를 사용하세요:

$ sed -n -e 's/.*# DF */DF /p' /tmp/df.txt 
DF [LBPOS]  Label Position
DF [KTG]    Category
DF [KARG]   Control Argument
DF [LNP]  Line Input

입력 파일의 공백이 공백 대신(또는 둘 다) 탭일 가능성이 있는 경우 [[:blank:]]공백 대신 사용하십시오. [[:blank:]]가로 공백과 일치합니다. 예를 들어( 기본 기본 정규식 BRE 대신 확장 정규식 ERE sed옵션 을 사용하여 수량자를 사용할 수 있음 ):-E+

sed -n -E 's/.*#[[:blank:]]+DF[[:blank:]]+/DF /p' /tmp/df.txt 

답변2

그리고 GNU grep:

$ grep -oP '# \KDF .*' file
DF [LBPOS]  Label Position
DF [KTG]    Category
DF [KARG]   Control Argument
DF [LNP]  Line Input

답변3

패턴의 두 가지 변형을 문자 그대로 해석하면 sed다음 두 가지 지침이 포함된 스크립트가 생성됩니다.

s/^## \(DF \)/\1/p
s/..* # \(DF \)/\1/p

첫 번째는 ## DF <anything>줄의 시작 부분에서 로 대체되며 DF <anything>, 이는 <anything>임의의 길이의 빈 문자열로 간주됩니다.

두 번째 명령어는 where <something> # DF <anything>로 대체되며, 이는 모든 길이의 비어 있지 않은 문자열로 간주됩니다. 기본 정규식은 하나 이상의 문자와 일치하는 패턴인 확장 정규식과 동일 합니다.DF <anything><something>..*.\{1,\}.{1,}.+

테스트(질문에서 테스트 데이터를 가져왔지만 각 줄의 처음 몇 개의 공백 문자는 제거됨):

$ sed -n -e 's/^## \(DF \)/\1/p' -e 's/..* # \(DF \)/\1/p'  file
DF [LBPOS]  Label Position
DF [KTG]    Category
DF [KARG]   Control Argument
DF [LNP]  Line Input

답변4

사용행복하다(이전 Perl_6)

~$ raku -ne 'put $/  if m/ ^ "## " <( DF .* )> $ || .+ "# " <( DF .* )> $ /;'  file
    
#OR
    
~$ raku -ne 'put $<> if m/ ^ "## " <( DF .* )> $ || .+ "# " <( DF .* )> $ /;'  file

위 내용은 Perl 계열의 프로그래밍 언어인 Raku로 작성된 답변입니다. Raku는 특히 유니코드에 대한 고급 지원 및 내장된 유리수 기능을 제공합니다.

즉, m/ /먼저 문자열의 시작 부분에서 일치 항목을 찾은 다음 "## ", 즉 <( DF .* )>"DF", 하나 이상의 문자가 뒤따르거나 ||두 번째로 하나 이상의 문자, 그 다음 인테리어 "# ", , 즉 가 뒤따릅니다 <( DF .* )>. "DF" 뒤에 0개 이상의 문자가 옵니다.

Raku의 <(... )>캡처 태그는 태그 외부의 모든 식별 요소를 제거합니다. 일치하는 항목이 발견되면 $/일치하는 변수만 반환(또는 $<>`)되어 일치하지 않는 줄이 제거됩니다.

입력 예:

local lbpos=21    # DF [LBPOS]  Label Position
local ktg="PILE"  # DF [KTG]    Category
## DF [KARG]   Control Argument
Some text
printf '%s\n' "$@"  \
      | while IFS="" read -r lnp; do  # DF [LNP]  Line Input
More text 

예제 출력:

DF [LBPOS]  Label Position
DF [KTG]    Category
DF [KARG]   Control Argument
DF [LNP]  Line Input

https://docs.raku.org
https://raku.org

관련 정보