2

を使用して、重複した空行を削除してテキスト ドキュメントを圧縮しようとしていますsed。これは私がやっていることです(役に立たない):

sed -i -E 's/\n{3,}/\n/g' file.txt

このマニュアルによると、正しくないことは理解していますが、正しく行う方法がわかりません。ありがとう。

4

6 に答える 6

4

トリプリーが上で示唆したように、私は代わりにPerlを使用していsedます:

perl -0777pi -e 's/\n{3,}/\n\n/g'
于 2012-09-25T09:06:45.000 に答える
4

あなたの例では の複数の\n実行\n\n\n. それを念頭に置いて、ここに2つの解決策があります:

sed '/^$/{ :l
    N; s/^\n$//; t l
    p; d; }' input 

sed の多くの実装では、埋め込まれた改行を;.

awk 't || !/^$/; { t = !/^$/ }'
于 2012-09-11T19:50:19.943 に答える
3

翻訳機能を使う

 tr -s '\n'

-s または --squeeze-repeats は、繰り返される文字のシーケンスを 1 つのインスタンスに減らします。

于 2012-09-11T15:41:10.560 に答える
1

tr -s '\n'これはまたはcat -sで処理する方がはるかに優れていますが、 に固執する場合sedは、GNU sed マニュアルのセクション 4.17 の例を次に示します。

#!/usr/bin/sed -f

# on empty lines, join with next
# Note there is a star in the regexp
:x
/^\n*$/ {
  N
  bx
}
# now, squeeze all '\n', this can be also done by:
# s/^\(\n\)*/\1/
s/\n*/\
/
于 2012-09-11T20:47:12.303 に答える
0

OPは空の行を圧縮したいと思います。たとえば、9つの連続した空の行がある場合、彼は3つだけにしたいと考えています。まさにそれを行う小さなbashスクリプトを作成しました:

#! /bin/bash
TOTALLINES="$(cat file.txt|wc -l)"
CURRENTLINE=1
while [ $CURRENTLINE -le $TOTALLINES ]
do
    L1=$CURRENTLINE
    L2=$(($L1 + 1))
    L3=$(($L1 +2))
    if [[ $(cat file.txt|head -$L1|tail +$L1) == "" ]]||[[ $(cat file.txt|head -$L1|tail +$L1) == " " ]]
    then
        L1EMPTY=true
    else 
        L1EMPTY=false
    fi
    if [[ $(cat file.txt|head -$L2|tail +$L2) == "" ]]||[[ $(cat file.txt|head -$L2|tail +$L2) == " " ]]
    then
        L2EMPTY=true
    else 
        L2EMPTY=false       
    fi
    if [[ $(cat file.txt|head -$L3|tail +$L3) == "" ]]||[[ $(cat file.txt|head -$L3|tail +$L3) == " " ]]
    then
        L3EMPTY=true
    else 
        L3EMPTY=false       
    fi  
    if [    $L1EMPTY = true ]&&[    $L2EMPTY = true ]&&[    $L3EMPTY = true ]
    then
        #do not cat line to temp file
        echo "Skipping line "$CURRENTLINE   
    else
        echo "$(cat file.txt|head -$CURRENTLINE|tail +$CURRENTLINE)">>temp.txt
        echo "Writing line " $CURRENTLINE
    fi
    ((CURRENTLINE++))
done    
cat temp.txt>file.txt
rm -r temp.txt
FINALTOTALLINES="$(cat file.txt|wc -l)"
EMPTYLINELINT=$(( $CURRENTLINE - $FINALTOTALLINES ))
echo "Deleted " $EMPTYLINELINT " empty lines."

于 2022-02-19T08:17:35.787 に答える