메모를 하는 데 사용하는 텍스트 파일이 있습니다. 일반 텍스트만 사용하고 일반적으로 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'; }