파일을 읽고 다음을 포함하는 모든 줄을 인쇄하고 싶습니다.
## 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