"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:]].

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에서는 "n "과 마찬가지로 S///원하지 않는 문자(예: 공백) 없이 결과 문자열을 생성하는 데 "capital-S" 연산자가 사용됩니다. chars예를 들어 10을 사용) 그리고 마지막으로 부울이 충족되면 .put원래 행이 그대로 반환됩니다.

참고 1: "S///는 s/// 연산자와 동일한 의미를 사용하지만 원래 문자열을 그대로 유지하고 $/ 대신 결과 문자열을 반환합니다($/는 여전히 s///와 동일한 값으로 설정됩니다). "

https://docs.raku.org/언어/regexes#S///_non-breaking_substitution

참고 2: Raku/Perl6에서 정규식 수정자(예: "global")는 부사라고 하며 (보통) :gor 연산자의 시작 부분, or 바로 뒤에 배치됩니다.S///s///Ss

참고 3: .Raku/Perl6의 도트는 테마 변수에 대한 메소드를 호출하는 데 사용되므로 $_코드의 첫 번째 "단어"는 .put본질적으로 의 약어입니다 $_.put.

https://docs.raku.org/언어/5to6-nutshell#-%3E_Method_calls

참고 4: Raku/Perl6에는 더 제한된 명령줄 플래그 세트가 있습니다. -e명령줄에서 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

관련 정보