これが機能する真のsed専用スクリプトです。以下に、コマンドラインでsedによって呼び出されるファイルとして記述しましたが、すべてコマンドラインで入力することも、別のスクリプトに入力することもできます。
以下をsedscript(またはあなたがそれを呼びたいもの)として保存します。出力の後に説明が続きます。
:start
h
s/\(.\ \ [^ ]*\).*/\1/
t continue
d
:continue
p
x
s/\(.\ \)\ [^ ]*\(\ .*\)/\1\2/
t start
d
今すぐ実行sed -f sedscript myfile.txt
上記の例をmyfile.txtとして保存すると、次のように出力されます。
a yao.com
a sina.com
b kongu.com
c polm.com
c unee.net
c 21cn.com
c iop.com
c foo.com
c bar.com
c baz.net
c happy2all.com
d kinge.net
Sedには、パターンバッファー(通常はs/a/b/
ある種のコマンドを操作する場所)とホールドバッファーがあります。このスクリプトでは、情報がホールドバッファーと前後に交換され、別の部分で作業している間、行の編集されていない部分が保持されます。
:start
=ジャンプを有効にするラベル
h
=パターンバッファ(現在の行)をホールドバッファにスワップします
s/\(.\ \ [^ ]*\).*/\1/
=ホールドバッファ内のフルラインは安全ですが、最初のドメイン以降のすべてを削除し、最初の目的のラインを残します(例:「ayao.com」)。
t continue
=前のコマンドで置換が行われた場合は、「続行」ラベルにジャンプします
d
=ジャンプしなかった場合、それは完了したことを意味します。パターンバッファを削除し、ファイルの次の行に進みます。
:continue
=前のジャンプのラベル
p
=パターンバッファを出力します(例:「ayao.com」)
x
=パターンバッファーをホールドバッファーと交換します(ホールドバッファーg
をパターンバッファーにコピーするために使用することもできます)
s/\(.\ \)\ [^ ]*\(\ .*\)/\1\2/
=元の文字列全体がパターンバッファにスワップされました-処理したドメインを削除します(例: "yao.com")
t start
=それが最後のドメインではなかった場合は、新しい短縮された文字列でスクリプトを最初からやり直してください。
d
=それが最後のドメインである場合は、パターンバッファーを削除し、ファイルの次の行に進みます。