Gillesのperlとawkのコンパクトな例を見た後、これを投稿したがりませんでしたが、私は既に演習を行っていました。この点だけでも興味があるかもしれません..(コメント付き!)
このスクリプトは、空白行が含まれている場合でも、空白行を空白と見なします。
テキスト内の複数のスペースは、単一のスペースに凝縮されます。
末尾の空白はテキスト行から削除されます。連続する空白行は1行に折りたたまれます。スクリプトは、上部と下部の空白行をそのまま残します。
最も些細なスクリプト以外の場合は、sedを別のスクリプトファイルとして構造化された形式で簡単に記述できます。以下にその例を示します。
拡張正規表現構文
呼び出しを使用:$ sed -rf script text-file
:first-empty-line
#================
/^[[:space:]]*$/ { # if pattern-space is empty...
$q # last line # flush-quit
n # pattern-flush=nextline-continue
:subsequent-empty-line
#=====================
/^[[:space:]]*$/ { # if pattern-space is empty...
$d # last line # pattern-delete-cycle
N # pattern+=nl+nextline
s/.*\n// # scrap the leading 'blank' line
t subsequent-empty-line # branch-on-substitute
}
}
:text-line
#=========
$q # last line # flush-quit
s/^(.*)[[:space:]]*/\1/ # trim trailing whitespace
s/ +/ /g # condense mulltiple spaces
N # pattern+=nl+nextline
/^.*\n[[:space:]]*$/ { # if newly-read line is blank
P # pattern-first-line-print
s/^.*\n// # remove the leading 'text' line
t first-empty-line # branch-on-substitute
}
# read line is text
s/\n/ / # replace \n with a space
t text-line # branch-on-substitute
注:flush
コメント内のの意味は、次のとおりです。パターンスペースをsedの内部stdout処理に送信します。stdoutへの明確な印刷を意味するものではありません。出力はsedの-n
オプションに依存します。例えば。q
指令手段のフラッシュが終了しないとこれら二つのスニペットを比較...:echo x |sed -e q
プリントは、X、echo x |sed -ne q
印刷物の何を使用して、一方p
に応じて、二回または一回の「x」に印刷するコマンドを-n
オプション。