sed를 사용하여 빈 줄을 삭제하려고합니다.
sed '/^$/d'
그러나 나는 운이 없다.
예를 들어 다음 줄이 있습니다.
xxxxxx
yyyyyy
zzzzzz
나는 그것이 다음과 같이되기를 원합니다.
xxxxxx
yyyyyy
zzzzzz
이것에 대한 코드는 무엇입니까?
sed를 사용하여 빈 줄을 삭제하려고합니다.
sed '/^$/d'
그러나 나는 운이 없다.
예를 들어 다음 줄이 있습니다.
xxxxxx
yyyyyy
zzzzzz
나는 그것이 다음과 같이되기를 원합니다.
xxxxxx
yyyyyy
zzzzzz
이것에 대한 코드는 무엇입니까?
답변:
"빈"줄에 공백이나 탭이있을 수 있습니다. 공백 만 포함하는 모든 행을 제거 하려면 POSIX 클래스 를 사용하십시오 sed
.
sed '/^[[:space:]]*$/d'
ERE를 사용하는 짧은 버전 (예 : gnu sed) :
sed -r '/^\s*$/d'
sed는 PCRE를 지원 하지 않습니다 .
-r
sed -i "" '/^[[:space:]]*$/d'
<filename>
,
^\s*$
는 모든 "빈"줄과 일치합니다. 여기서 비어 있으면 줄에 문자가 없거나 줄에 빈 문자열 (예 : 공백) 만있는 것입니다. 모든 일치하는 줄은 d
명령 으로 sed에 의해 제거됩니다 .
awk
해결책이 없습니다 .
awk 'NF' file
다음을 반환합니다.
xxxxxx
yyyyyy
zzzzzz
어떻게 작동합니까? 때문에 NF
, 그 라인이 비어있는 '필드의 수 "에 대한 스탠드 그 AWK False로 0을 평가하고 더 선이 인쇄되지 않습니다 때문에, 0 fiedls이있다; 그러나 필드가 하나 이상 있으면 평가는 참이며 awk
기본 조치를 수행합니다. 현재 행을 인쇄하십시오.
$ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -)
real 0m0.006s
user 0m0.000s
sys 0m0.008s
$ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -)
real 0m0.014s
user 0m0.002s
sys 0m0.006s
합니다. 패턴과 같은 awk 스크립트에 이것을 포함시키는 멋진 방법을 알고 있습니까? awk '/ mypattern / {do stuff ...}'
awk 'NF {do stuff...}'
.
sed '/^$/d'
파일을 수정 하시겠습니까? 그렇다면 -i
플래그를 사용해야합니다 .
아마도 그 줄이 비어 있지 않을 수도 있습니다. 그렇다면이 질문 을보십시오 .txt 파일에서 빈 줄을 제거하고 줄의 시작과 끝에서 공백을 제거하십시오 .
sed -i '/^$/d'
한 가지 방법입니다.
[]
해야 하지 여기에 코드가 정확하지 않은, 그래서 브라켓 표현식에서 이스케이프 \[\[:space:\]\]
또는 \[ \t\]
-해야 [[:space:]]
하고 [ \t]
.
나는 이것이 가장 쉽고 빠른 것이라고 믿습니다.
cat file.txt | grep .
모든 공백 줄을 무시 해야하는 경우 다음을 시도하십시오.
cat file.txt | grep '\S'
예:
s="\
\
a\
b\
\
Below is TAB:\
\
Below is space:\
\
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l
출력
7
5
cat
, grep
파일도 가져옵니다 :grep . file.txt
grep '\S'
확실히 휴대용이 아닙니다. 그렇다면 grep -P
사용할 수 grep -P '\S'
있지만 모든 플랫폼에서 지원되는 것은 아닙니다.
grep .
다른 솔루션과 비교할 때 단점은 모든 텍스트를 빨간색으로 강조 표시한다는 것입니다. 다른 솔루션은 원래 색상을 유지할 수 있습니다. 비교 unbuffer apt search foo | grep .
에unbuffer apt search foo | grep -v ^$
여기 에 허용 된 답변과 위 의 허용 된 답변의 도움으로 다음 을 사용했습니다.
$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt
`s/^ *//` => left trim
`s/ *$//` => right trim
`/^$/d` => remove empty line
`/^\s*$/d` => delete lines which may contain white space
이것은 모든 기반을 다루고 내 요구에 완벽하게 작동합니다. 오리지널 포스터 @Kent and @kev
이것은 awk에서도 작동합니다.
awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
텍스트 파일이 Windows에서 작성되었으므로 행 끝 순서는 \r\n
입니다. sed를 실행하거나 사용하기 전에 dos2unix를 사용하여 UNIX 스타일 텍스트 파일로 변환 할 수 있습니다.
sed -r "/^\r?$/d"
캐리지 리턴 여부에 관계없이 빈 줄을 제거합니다.
-r
깃발 은 무엇을 하고 있으며 -i
파일을 직접 수정하고 화면에 인쇄하지 않도록 결합 할 수 있습니다. 또한이 명령은 다음과 같이 작동한다고 생각합니다.sed -r "/^\r$/d"
또 다른 옵션이없는 sed
, awk
, perl
, 등
strings $file > $output
문자열-파일에 인쇄 가능한 문자열을 인쇄합니다.
strings
대신에 의미 string
합니까?
내 bash
대답은 다음과 같이 perl
대체 패턴을 사용하여 전역 패턴 g
플래그 와 함께 사용하는 것이 좋습니다 .
$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz
이 답변은 빈 줄에 공백이 있는지 여부를 설명하고 ( [\ ]*
) |
여러 검색어 / 필드를 구분하는 데 사용 합니다. macOS High Sierra 및 CentOS 6/7에서 테스트되었습니다.
참고로, OP의 원래 코드 sed '/^$/d' $file
는 bash
고성능 슈퍼 컴퓨팅 클러스터에서 macOS High Sierra 및 CentOS 6/7 Linux의 터미널에서 잘 작동 합니다.