この記事は、進行中の Unix Sed Tips and Tricks シリーズの一部です。
他のプログラミング言語と同様に、sed には、プログラムの流れを制御するための特別な分岐コマンドも用意されています。
この記事では、次の 2 種類の Sed 分岐を確認します。
<オール>
Sed 無条件分岐構文:
$ sed ':label command(s) b label'
- :label – ラベルの指定
- commands – 任意の sed コマンド
- label – ラベルの任意の名前
- b ラベル – 条件をチェックせずにラベルにジャンプします。ラベルが指定されていない場合は、スクリプトの最後にジャンプします。
Sed 条件分岐構文:
$ sed ':label command(s) t label'
- :label – ラベルの指定
- commands – 任意の sed コマンド
- label – ラベルの任意の名前
- ラベル – 最後の代替コマンドがパターン スペースを変更した場合にのみ、ラベルにジャンプします。ラベルが指定されていない場合は、スクリプトの最後にジャンプします。
サンプル テスト ファイルを作成する
まず、以下の例で使用する geekstuff.txt ファイルを作成しましょう。
$ cat thegeekstuff.txt Linux Administration Scripting Tips and Tricks Windows Administration Database Administration of Oracle Administration of Mysql Security Network Online\ Security Productivity Google Search\ Tips "Web Based Time Tracking, Web Based Todo list and Reduce Key Stores etc" $
I.無条件分岐の Sed の例
Sed の例 1. ファイル全体で最初に出現するパターンを置換
ファイル thegeekstuff.txt で、最初に出現する「Administration」を「Supervision」に置き換えます。
$ sed '/Administration/{ s/Administration/Supervision/ :loop n b loop }' thegeekstuff.txt Linux Supervision Scripting Tips and Tricks Windows Administration Database Administration of Oracle Administration of Mysql Security Network Online\ Security Productivity Google Search\ Tips "Web Based Time Tracking, Web Based Todo list and Reduce Key Stores etc"<オール>
- 「n」は、パターン スペースを出力して次の行で上書きする sed コマンドです。
- ラベルとして「ループ」を使用。 「n」は現在の行を出力し、次の行でパターン スペースを上書きします。 b loop は再び :loop にジャンプします。したがって、このループは thegeekstuff.txt の残りの内容を出力します。
Sed の例 2. ファイル全体でパターン ” ” の間のデータを削除する
サンプル ファイルでは、「」の間に 3 行あります。
sed -e ':loop $!{ N /\n$/!b loop } s/\"[^\"]*\"//g' thegeekstuff.txt Linux Administration Scripting Tips and Tricks Windows Administration Database Administration of Oracle Administration of Mysql Security Network Online\ Security Productivity Google Search\ Tips $<オール>
- $! – ファイルの終わりでない場合
- N – \n で区切られたパターン スペースで次の行を追加します
- /\n$/!b ループ – これがファイルの最後の行でない場合は、再びループにジャンプします。
Sed の例 3. ファイルの HTML タグを削除する
たとえば、次の html コンテンツを含むファイルがあるとします
$ cat index.html <html><body> <table border=2><tr><td valign=top align=right>1.</td> <td>Line 1 Column 2</ td> </table> </body></html>
次の sed コマンドは、指定されたファイルからすべての html タグを削除します
$ sed '/</{ :loop s/<[^<]*>//g /</{ N b loop } }' index.html 1. Line 1 Column 2<オール>
- 次の行に参加
- 単一の「<」がなくなるまで、すべての HTML タグを削除します
II.条件分岐の Sed の例
Sed の例 4。行がバックスラッシュで終わっている場合、次の行をそれに追加します。
サンプル ファイルにはバックスラッシュで終わる 2 行があり、次の行をそれに追加する必要があります。
$ sed ' :loop /\\$/N s/\\\n */ / t loop' thegeekstuff.txt Linux Administration Scripting Tips and Tricks Windows Administration Database Administration of Oracle Administration of Mysql Security Network Online Security Productivity Google Search Tips "Web Based Time Tracking, Web Based Todo list and Reduce Key Stores etc"<オール>
Sed の例 5. 数値文字列を圧縮します。
sed ' :loop s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/ t loop' 12342342342343434 12,342,342,342,343,434<オール>
Sed の例 6. 書式設定:行の先頭のスペースをすべて「+」に置き換えます
$ sed ' s/^ */&\n/ :loop s/^\n//;s/ \n/\n+/ t loop' test Linux ++++++++Administration ++++++++Scripting ++++++++++++++++Tips and Tricks Windows ++++++++Administration Database ++++++++Administration of Oracle ++++++++Administration of Mysql Security ++++++++Network +++++++++++++++++Online\ ++++++++Security Productivity ++++++++Google Search\ ++++++++Tips ++++++++"Web Based Time Tracking, ++++++++Web Based Todo list and ++++++++Reduce Key Stores etc"<オール>