문자, 숫자 또는 기호가 'x'보다 적은 텍스트 파일의 모든 줄을 어떻게 삭제합니까? awk 'length($0)>'
공백이 포함되어 있으므로 사용할 수 없습니다 .
답변1
n
그래픽 기호 미만을 포함하는 줄을 삭제한다고 가정합니다 .
awk -v n=5 '{ line = $0; gsub("[^[:graph:]]", "") } length >= n { print line }'
일치하지 않는 모든 문자가 삭제됩니다 [[:graph:]]
. 남아 있는 문자열의 길이가 보다 크거나 같으면 n
(수정되지 않은) 행이 인쇄됩니다.
값은 n
명령줄에 제공됩니다.
[[:graph:]]
는 와 동일 [[:alnum:][:punct:]]
하며 이는 와 동일합니다 [[:alpha:][:digit:][:punct:]]
. 공백 과 거의 동일 [[:print:]]
하지만 일치하지 않습니다.
대신 을 사용하여 모든 탭이나 공백을 삭제할 [^[:graph:]]
수 있습니다 .[[:blank:]]
를 사용하면 sed
위 awk
코드를 거의 문자 그대로 따르며,
sed -e 'h; s/[^[:graph:]]//g' \
-e '/.\{5\}/!d; g'
또는 단순화(공백이 아닌 문자만 계산),
sed -e 'h; s/[[:blank:]]//g' \
-e '/...../!d; g'
이것은 먼저 현재 라인을 를 사용하여 보류 공간에 저장합니다 h
. 그런 다음 가 있는 줄에서 그래프가 아닌 문자(또는 두 번째 변형의 공백 문자)를 모두 삭제합니다 s///g
. 줄에 5자 미만이 포함되어 있으면(원하는 숫자로 변경하거나 두 번째 변형에서 점 수를 변경) 줄이 삭제됩니다. 그렇지 않으면 저장된 라인이 홀드 공간에서 인출되어 g
(암시적으로) 인쇄됩니다.
답변2
sed -e 's/[^[:space:][:cntrl:]]/&/20' -e t -e d < file
file
공백이 아닌 비제어 문자가 20개 이상 포함된 행을 인쇄합니다 ( [[:graph:]]
또는 참조 [[:alnum:][:punct:]]
, 설명에 어떤 문자를 포함/제외할지 확실하지 않습니다. 일부 시스템에서는 줄 바꿈하지 않는 공백 문자가 ) 에는 포함되어 있지만 graph
포함되어 있지 않습니다 space
.
아이디어는 공백이 아닌/제어 문자의 20번째 발생을 자체( &
)로 대체하려고 시도하고 해당 대체가 성공하면( t
) 분기하여 d
작업을 건너뛰는 것입니다(삭제).
를 사용하면 awk
다음을 수행할 수 있습니다.
awk 'gsub(/[^[:space:][:cntrl:]]/, "&") >= 20' < file
gsub()
대체 횟수를 반환 한다는 사실에 의존합니다 .
와 함께 grep
:
grep -E '^([[:space:][:cntrl:]]*[^[:space:][:cntrl:]]){20}' < file
( (.*[^[:space:][:cntrl:]]){20}
또한 작동하지만 더 비쌉니다).
답변3
이렇게 하면 10자에서 10자 미만의 줄이 삭제됩니다.
sed -E '/^.{1,11}$/d' filename
또는
sed -r '/^.{1,11}$/d' filename
공백을 자르려면 다음을 사용할 수 있습니다.
sed -E 's/^[[:space:]]*//g;s/[[:space:]]*$//g;/^.{1,11}$/d' filename
내부에서(파일 내부에서 직접) 삭제를 수행하려면 다음을 사용하세요.-나옵션이 있습니다.
답변4
Raku 사용(옛 Perl6)
raku -ne '.put if chars( S:g/\s// ) >= 10;' filename
또는
raku -ne '.put unless chars( S:g/\s// ) < 10;' filename
또는
raku -ne '.put unless chars( S:g/\W// ) < 10;' filename
또는
raku -ne '.put unless chars( S:g/<ws>// ) < 10;' filename
간단히 말하면, Raku/Perl6에서 "capital-S" S///
연산자는 원하지 않는 문자(예: 공백)가 없는 결과 문자열을 생성하는 데 사용됩니다. 결과 문자열의 문자는 chars
"n"과 비교하여 함수로 계산됩니다(10 사용). 예를 들어) 마지막으로 부울이 만족되면 .put
원래 줄을 그대로 반환합니다.
참고 1: "S///는 원래 문자열을 그대로 유지하고 $/ 대신 결과 문자열을 반환한다는 점을 제외하면 s/// 연산자와 동일한 의미를 사용합니다($/는 여전히 s///와 동일한 값으로 설정됨). ."
https://docs.raku.org/언어/regexes#S///_non-destructive_substitution
참고 2: Raku/Perl6에서 ('global'의 경우)와 같은 정규식 수정자는 부사로 알려져 있으며 (일반적으로) or 연산자 :g
의 머리 부분 , or 바로 뒤에 배치됩니다 .S///
s///
S
s
참고 3: .
Raku/Perl6의 점은 주제 변수에 대한 메소드를 호출하는 데 사용되므로 $_
코드의 첫 번째 '단어' .put
는 본질적으로 의 약어입니다 $_.put
.
https://docs.raku.org/언어/5to6-nutshell#-%3E_Method_calls
참고 4: Raku/Perl6에는 훨씬 더 제한된 명령줄 플래그 세트가 있습니다. 플래그 -e
("execute")는 명령줄에서 Raku/Perl6 코드를 실행합니다. 플래그 -n
는 Raku/Perl6 코드를 라인 단위로 실행합니다. 즉, 입력 파일의 각 라인에 대해 한 번에 한 라인씩 실행하여 결과를 반환합니다. 두 개의 플래그를 하나의 플래그로 결합할 수 있지만 -ne
이에 관계없이 -e
플래그는 마지막에 와야 합니다.
Perl_6 링크:
https://docs.raku.org/언어/5to6-nutshell#Command-line_flags
https://github.com/rakudo/rakudo/wiki/Running-rakudo-from-the-command-line