텍스트 파일에서 문자, 숫자 또는 기호가 "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")는 부사라고 하며 (보통) :g
or 연산자의 시작 부분, or 바로 뒤에 배치됩니다.S///
s///
S
s
참고 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