파일에서 여러 개의 빈 줄을 제거하는 방법은 무엇입니까?

파일에서 여러 개의 빈 줄을 제거하는 방법은 무엇입니까?

메모를 하는 데 사용하는 텍스트 파일이 있습니다. 일반 텍스트만 사용하고 일반적으로 cat >> file. 각 세션이 끝나면 일반적으로 Ctrl+ 로 파일을 닫기 전에 D세션을 구분하기 위해 많은 수(5-10)의 빈 줄(Enter)을 추가합니다 .

이것은 분명히 그다지 똑똑하지는 않지만 나에게는 효과적입니다. 나하다그러나 불필요한 빈 줄이 많이 생기므로 나는 여분의 줄(대부분)을 제거하는 방법을 찾고 있습니다. 여러 옵션과 함께 직접 사용할 수 있는 Linux 명령(잘라내기, 붙여넣기, grep...?)이 있습니까? 또는 내가 원하는 것을 달성하기 위해 sed, awk 또는 perl(실제로는 sed 또는 awk를 선호하지만 모든 스크립팅 언어에서 사용할 수 있음) 스크립트를 아는 사람이 있습니까? C++로 무언가를 작성하는 것(실제로는 스스로 할 수 있는 일)이 너무 지나친 것 같았습니다.

상황 #1: 나에게 필요한 것은 2개 이상의 연속된 빈 줄을 제거하고 이를 두 개의 빈 줄로 바꿀 수 있는 스크립트/명령입니다. 그러나 하나 이상의 행(2개 이상)을 제거하거나 여러 개의 빈 줄을 하나로 바꾸는 데에도 적용할 수 있다면 좋을 것입니다.

사례 #2: 스크립트/명령을 사용하여 제거할 수도 있습니다.하나의두 줄의 텍스트 사이에 빈 줄이 있지만 여러 개의 빈 줄이 남아 있습니다(그 중 하나를 제거하는 것도 허용 가능).

답변1

사례 1:

awk '!NF {if (++n <= 2) print; next}; {n=0;print}'

사례 2:

awk '!NF {s = s $0 "\n"; n++; next}
     {if (n>1) printf "%s", s; n=0; s=""; print}
     END {if (n>1) printf "%s", s}'

답변2

여러 개의 빈 줄 인스턴스를 하나의 빈 줄로 축소 할 수 있지만 uniq, 텍스트가 포함된 줄이 동일하고 서로 아래에 있는 경우 축소할 수도 있습니다.

답변3

사례 1:

perl -i -ane '$n=(@F==0) ? $n+1 : 0; print if $n<=2'

사례 2:

perl -i -ane '$n=(@F==0) ? $n+1 : 0; print $n==2 ? "\n$_" : $n==1 ? "" : $_ '

답변4

다음과 같은안톤"uniq"를 사용하는 것이 좋습니다...

선행, 후행 및 반복되는 빈 줄을 제거합니다.

# Get large random string.
rand_str=; while [[ ${#rand_str} -lt 40 ]]; do rand_str=$rand_str$RANDOM; done

# Add extra lines at beginning and end of stdin.
(echo $rand_str; cat; echo $rand_str) |

# Convert empty lines to random strings.
sed "s/^$/$rand_str/" |

# Remove duplicate lines.
uniq |

# Remove first and last line.
sed '1d;$d' |

# Convert random strings to empty lines.
sed "s/$rand_str//"

긴 목록에서:

(rand_str=; while [[ ${#rand_str} -lt 40 ]]; do rand_str=$rand_str$RANDOM; done; (echo $rand_str; cat; echo $rand_str) | sed "s/^$/$rand_str/" | uniq | sed '1d;$d' | sed "s/$rand_str//")

아니면 그냥 "cat -s"를 사용하세요.

유지하기 위해 괄호에서 중괄호로 변경했습니다.현재 쉘 컨텍스트에서나는 이것이 더 효율적이라고 생각합니다. 중괄호에는 마지막 명령 뒤에 세미콜론이 필요하고 이를 구분하기 위한 공백이 필요합니다.

# Add extra blank lines at beginning and end.
# These will be removed in final step.
{ echo; cat; echo; } |

# Replace multiple blank lines with a single blank line.
cat -s |

# Remove first and last line.
sed '1d;$d'

한 줄에.

{ { echo; cat; echo; } | cat -s | sed '1d;$d'; }

관련 정보