텍스트 파일에서 'x' 문자 미만의 모든 줄을 삭제하는 방법은 무엇입니까?

텍스트 파일에서 'x' 문자 미만의 모든 줄을 삭제하는 방법은 무엇입니까?

문자, 숫자 또는 기호가 '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:]]

를 사용하면 sedawk코드를 거의 문자 그대로 따르며,

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///Ss

참고 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

관련 정보