Advanced sed:Linuxでのテキストストリームの管理。 Linux sedストリーミングテキストエディタSedを使用して、ファイルに行を挿入します
前回、bashスクリプトの関数、特にコマンドラインから関数を呼び出す方法について説明しました。 今日のトピックは、文字列データを処理するための非常に便利なツールです。sedと呼ばれるLinuxユーティリティです。 これは、ログファイル、構成ファイル、およびその他のファイルのように見えるテキストを操作するためによく使用されます。
bashスクリプトで何らかの方法でデータを処理している場合は、sedおよびgawkツールに精通している必要があります。 ここでは、sedとテキストの操作に焦点を当てます。これは、bashスクリプト開発の広大な範囲を旅する上で非常に重要なステップです。
ここでは、sedの操作の基本を分析し、このツールの使用例を3ダース以上見ていきます。
sedの基本
sedユーティリティはストリームテキストエディタと呼ばれます。 nanoのようなインタラクティブなテキストエディタは、キーボードを使用したテキストの操作、ファイルの編集、テキストの追加、削除、変更を行います。 Sedを使用すると、開発者が定義した一連のルールに基づいてデータストリームを編集できます。 このコマンドを呼び出すためのスキームは次のようになります。$ sedオプションファイル
デフォルトでは、sedは、コマンドのセットとして表される、呼び出されたときに指定されたルールをSTDINに適用します。 これにより、データをsedに直接渡すことができます。
たとえば、次のようになります。
$ echo "これはテストです" | sed "s / test / another test /"
このコマンドを実行すると、次のようになります。
簡単なsed呼び出しの例
この場合、sedは、処理のために渡された文字列の「test」という単語を「anothertest」という単語に置き換えます。 ストレートスラッシュは、引用符で囲まれたテキストを処理するためのルールをフォーマットするために使用されます。 この例では、s / pattern1 / pattern2 /のようなコマンドが使用されました。 文字「s」は「substitute」という単語の略語です。つまり、代替チームがあります。 Sedは、このコマンドを実行して、転送されたテキストを確認し、その中にあるフラグメント(どのフラグメントについて説明しますか、以下で説明します)をpattern1に対応してpattern2に置き換えます。
上記は、sedを使用するための基本的な例です。 実際、sedは、ファイルの操作など、はるかに複雑なワードプロセッシングシナリオで使用できます。
以下は、テキストの一部を含むファイルと、このコマンドでそれを処理した結果です。
$ sed "s / test / another test" ./myfile
テキストファイルとその処理結果
ここでは、上記で使用したのと同じアプローチが適用されますが、sedはファイルに保存されているテキストを処理するようになりました。 ただし、ファイルが十分に大きい場合、sedはデータをチャンクで処理し、ファイル全体が処理されるのを待たずに、処理された内容を画面に表示することに気付く場合があります。
Sedは、処理中のファイルのデータを変更しません。 エディターはファイルを読み取り、読み取った内容を処理して、出力をSTDOUTに送信します。 ソースファイルが変更されていないことを確認するには、sedに渡された後、それを開くだけで十分です。 必要に応じて、sedの出力をファイルにリダイレクトし、古いファイルを上書きする可能性があります。 このシリーズの以前の1つで、入力ストリームと出力ストリームのリダイレクトを扱っているものに精通している場合は、これを実行できるはずです。
sedを呼び出すときにコマンドセットを実行する
データに対して複数の操作を実行するには、sedを呼び出すときに-eオプションを使用します。 たとえば、2つのテキストの置換を整理する方法は次のとおりです。$ sed -e "s / This / That /; s / test / another test /" ./myfile
sedを呼び出すときに-eスイッチを使用する
両方のコマンドは、ファイルのテキストの各行に適用されます。 それらはセミコロンで区切る必要があり、コマンドの終わりとセミコロンの間にスペースがあってはなりません。
sedを呼び出すときに複数のテキスト処理パターンを入力するには、最初の一重引用符を入力した後、Enterキーを押してから、最後の引用符を忘れずに新しい行に各ルールを入力します。
$ sed -e "> s / This / That /> s / test / another test /" ./myfile
これは、この形式で表示されるコマンドが実行された後に発生することです。
sedを操作する別の方法
ファイルからのコマンドの読み取り
テキストを処理するためのsedコマンドが多数ある場合は、通常、最初にそれらをファイルに書き出すのが最善です。 コマンドを含むファイルをsedに通知するには、-fスイッチを使用します。mycommandsファイルの内容は次のとおりです。
S / This / That / s / test / another test /
sedを呼び出して、エディターにコマンドを含むファイルと処理するファイルを渡します。
$ sed -f mycommands myfile
このようなコマンドを呼び出した結果は、前の例で得られたものと同様です。
sedを呼び出すときにコマンドでファイルを使用する
コマンドフラグを置き換える
次の例をよく見てください。$ sed "s / test / another test /" myfile
これがファイルの内容であり、sedがそれを処理するときに生成されるものです。
ソースファイルとその処理結果
replaceコマンドは通常、複数行で構成されるファイルを処理しますが、各行で検索されたテキストの最初の部分のみが置き換えられます。 パターンのすべての出現を置き換えるには、適切なフラグを使用する必要があります。
フラグを使用するときに置換コマンドを作成するための構文は、次のようになります。
S /パターン/置換/フラグ
このコマンドの実行は、いくつかの方法で変更できます。
- 番号を渡すとき、文字列内のパターンオカレンスのシーケンス番号が考慮されます。このオカレンスは置き換えられます。
- gフラグは、文字列内のパターンのすべての出現を処理する必要があることを示します。
- pフラグは、元の文字列の内容を出力する必要があることを示します。
- w fileフラグは、テキスト処理の結果をファイルに書き込むようにコマンドに指示します。
$ sed "s / test / another test / 2" myfile
置換するフラグメントの位置を指定してreplaceコマンドを呼び出す
ここでは、置換フラグとして番号2を指定しました。これにより、各行で2番目に出現する目的のパターンのみが置換されました。 それでは、グローバル置換フラグを試してみましょう-g:
$ sed "s / test / another test / g" myfile
出力からわかるように、このコマンドは、テキスト内のパターンのすべての出現箇所を置き換えました。
グローバル交換
p置換コマンドフラグは一致した行の出力を許可しますが、sedを呼び出すときに指定された-nオプションは通常の出力を抑制します。
$ sed -n "s / test / another test / p" myfile
その結果、この構成でsedを実行すると、特定のテキストが見つかった行(この場合は1行)のみが画面に表示されます。
置換コマンドフラグpの使用
テキスト処理の結果をファイルに保存できるwフラグを使用してみましょう。
$ sed "s / test / another test / w output" myfile
テキスト処理結果をファイルに保存する
コマンドの操作中にデータがに出力され、処理された行がwの後に名前が指定されたファイルに書き込まれることがはっきりとわかります。
区切り文字
/ etc / passwdで/ bin / bashを/ bin / cshに置き換えることを想像してみてください。 タスクはそれほど難しくありません:$ sed "s / \ / bin \ / bash / \ / bin \ / csh /" / etc / passwd
しかし、見た目はあまり良くありません。 スラッシュは区切り文字として使用されるため、sedに渡される行の同じ文字をエスケープする必要があります。 その結果、コマンドの可読性が低下します。
幸い、sedを使用すると、置換コマンドで使用する区切り文字を自分で設定できます。 区切り文字は、sの後に出現する最初の文字です。
$ sed "s!/ bin / bash!/ bin / csh!" / etc / passwd
この場合、感嘆符が区切り文字として使用され、コードが以前よりも読みやすく、よりクリーンになります。
処理するテキストフラグメントの選択
これまで、エディターに渡されたすべてを処理するためにsedを呼び出してきました。 場合によっては、テキストの一部のみをsedで処理する必要があります。特定の行または行のグループです。 この目標を達成するには、次の2つのアプローチがあります。- 処理する行数に制限を設定します。
- 処理する行に一致するフィルターを指定します。
$ sed "2s / test / another test /" myfile
sedを呼び出すときに指定された番号である1行のみを処理します
2番目のオプションは、文字列の範囲です。
$ sed "2,3s / test / another test /" myfile
行範囲の処理
さらに、replaceコマンドを呼び出して、ファイルが特定の行から最後まで処理されるようにすることができます。
$ sed "2、$ s / test / another test /" myfile
2行目から最後までファイルを処理する
replaceコマンドを使用して、指定されたフィルターに一致する行のみを処理するには、次のようにコマンドを呼び出す必要があります。
$ sed "/ likegeeks / s / bash / csh /" / etc / passwd
上で説明したことと同様に、テンプレートはコマンド名sの前に渡されます。
フィルタに一致する行の処理
ここでは、非常に単純なフィルターを使用しました。 このアプローチの可能性を完全に明らかにするために、正規表現を使用できます。 これらについては、このシリーズの次の記事のいずれかで説明します。
行を削除する
sedユーティリティは、文字列内の文字のシーケンスを他の文字に置き換えるだけではありません。 その助けを借りて、つまり、dコマンドを使用して、テキストストリームから行を削除できます。コマンド呼び出しは次のようになります。
$ sed "3d" myfile
テキストから3行目を削除します。 これはファイルではないことに注意してください。 ファイルは変更されません。削除はsedによって生成された出力にのみ影響します。
3行目を削除する
dコマンドを呼び出すときに削除する行番号を指定しない場合、ストリーム内のすべての行が削除されます。
dコマンドを一連の行に適用する方法は次のとおりです。
$ sed "2,3d" myfile
行の範囲を削除する
そして、与えられた行からファイルの終わりまで、行を削除する方法は次のとおりです。
$ sed "3、$ d" myfile
ファイルの終わりまでの行を削除します
次のパターンに従って、行を削除することもできます。
$ sed "/ test / d" myfile
パターンによる文字列の削除
dを呼び出すときに、いくつかのパターンを指定できます。パターンが発生する行と、それらの間にある行は削除されます。
$ sed "/ second /、/ four / d" myfile
パターンを使用して行の範囲を削除する
ストリームへのテキストの挿入
sedでは、iとコマンドを使用してデータをテキストストリームに挿入できます。- iコマンドは、指定された行の前に改行を追加します。
- コマンドは、指定された行の後に改行を追加します。
$ echo「別のテスト」| sed "i \ First test"
チームi
次に、コマンドを見てみましょう。
$ echo「別のテスト」| sed "a \ First test"
チームa
ご覧のとおり、これらのコマンドは、ストリームからのデータの前後にテキストを追加します。 途中に線を追加する必要がある場合はどうなりますか?
ここでは、ストリーム内の参照行の番号、またはテンプレートを指定することで支援されます。 ここでは、文字列を範囲としてアドレス指定することはできません。 新しい行を挿入する前の行番号を指定して、iコマンドを呼び出しましょう。
$ sed "2i \これは挿入された行です。" myfile
参照行番号を指定したiコマンド
コマンドで同じことをしましょう:
$ sed "2a \これは追加された行です。" myfile
参照行番号を使用してコマンドを実行します
iとコマンドの動作の違いに注意してください。 最初の行は指定された行の前に新しい行を挿入し、2番目の行は後に挿入します。
文字列の置換
cコマンドを使用すると、データストリーム内のテキスト行全体の内容を変更できます。 それを呼び出すときは、新しいデータをストリームに追加する代わりに、行番号を指定する必要があります。$ sed "3c \これは変更された行です。" myfile
文字列全体を置き換える
コマンドを呼び出すときにプレーンテキストまたは正規表現の形式のパターンを使用すると、パターンに一致するすべての行が置き換えられます。
$ sed "/ This is / cこれは変更されたテキスト行です。" myfile
文字列をパターンに置き換える
文字置換
yコマンドは個々の文字を操作し、呼び出されたときに渡されたデータに従ってそれらを置き換えます。$ sed "y / 123/567 /" myfile
文字置換
このコマンドを使用するときは、テキストストリーム全体に適用されることを考慮する必要があります。特定の文字の出現に制限することはできません。
行番号の表示
=コマンドを使用してsedを呼び出すと、ユーティリティはデータストリームの行番号を出力します。$ sed "=" myfile
行番号の表示
ストリームエディタは、内容の前に行番号を出力しました。
このコマンドにパターンを渡してsed-nスイッチを使用すると、パターンに一致する行番号のみが出力されます。
$ sed -n "/ test / =" myfile
パターンに一致する行番号を表示する
ファイルから挿入するデータを読み取る
上記では、sedを呼び出すときに、データをストリームに挿入し、何を挿入するかを指定する手法について説明しました。 ファイルをデータソースとして使用することもできます。 これを行うには、rコマンドを使用します。これにより、指定したファイルからストリームにデータを挿入できます。 呼び出すときに、ファイルの内容またはテンプレートを挿入する行番号を指定できます。例を考えてみましょう。
$ sed "3r newfile" myfile
ストリームへのファイルコンテンツの挿入
ここでは、newfileの内容がmyfileの3行目の後に挿入されています。
rコマンドを呼び出すときにテンプレートを使用すると、次のようになります。
$ sed "/ test / r newfile" myfile
rコマンドを呼び出すときにワイルドカードを使用する
ファイルの内容は、パターンに一致する各行の後に挿入されます。
例
そのような仕事を想像してみましょう。 特定の文字シーケンスがあり、それ自体は無意味であり、別のファイルから取得したデータに置き換える必要があるファイルがあります。 つまり、文字シーケンスDATAがプレースホルダーの役割を果たすファイルnewfileとします。 DATAの代わりとなるデータはデータファイルに保存されます。この問題は、sedストリームエディターのrコマンドとdコマンドを使用して解決できます。
$ Sed "/ DATA> /(r newfile d)" myfile
プレースホルダーを実際のデータに置き換える
ご覧のとおり、DATAプレースホルダーの代わりに、sedはデータファイルから出力ストリームに2行を追加しました。
結果
今日は、sedストリームエディターの操作の基本について説明しました。 実際、sedは大きなトピックです。 それを学ぶことは、新しいプログラミング言語を学ぶことと比較することができますが、基本を理解すれば、必要なレベルにsedを習得することができます。 結果として、それを使ってテキストを処理するあなたの能力はあなたの想像力によってのみ制限されます。それが今日のすべてです。 次回は、awkデータ処理言語について説明します。
読者の皆様! 日常業務でsedを使用していますか? はいの場合、あなたの経験を共有してください。
前回、bashスクリプトの関数、特にコマンドラインから関数を呼び出す方法について説明しました。 今日のトピックは、文字列データを処理するための非常に便利なツールです。sedと呼ばれるLinuxユーティリティです。 これは、ログファイル、構成ファイル、およびその他のファイルのように見えるテキストを操作するためによく使用されます。
bashスクリプトで何らかの方法でデータを処理している場合は、sedおよびgawkツールに精通している必要があります。 ここでは、sedとテキストの操作に焦点を当てます。これは、bashスクリプト開発の広大な範囲を旅する上で非常に重要なステップです。
ここでは、sedの操作の基本を分析し、このツールの使用例を3ダース以上見ていきます。
sedの基本
sedユーティリティはストリームテキストエディタと呼ばれます。 nanoのようなインタラクティブなテキストエディタは、キーボードを使用したテキストの操作、ファイルの編集、テキストの追加、削除、変更を行います。 Sedを使用すると、開発者が定義した一連のルールに基づいてデータストリームを編集できます。 このコマンドを呼び出すためのスキームは次のようになります。$ sedオプションファイル
デフォルトでは、sedは、コマンドのセットとして表される、呼び出されたときに指定されたルールをSTDINに適用します。 これにより、データをsedに直接渡すことができます。
たとえば、次のようになります。
$ echo "これはテストです" | sed "s / test / another test /"
このコマンドを実行すると、次のようになります。
簡単なsed呼び出しの例
この場合、sedは、処理のために渡された文字列の「test」という単語を「anothertest」という単語に置き換えます。 ストレートスラッシュは、引用符で囲まれたテキストを処理するためのルールをフォーマットするために使用されます。 この例では、s / pattern1 / pattern2 /のようなコマンドが使用されました。 文字「s」は「substitute」という単語の略語です。つまり、代替チームがあります。 Sedは、このコマンドを実行して、転送されたテキストを確認し、その中にあるフラグメント(どのフラグメントについて説明しますか、以下で説明します)をpattern1に対応してpattern2に置き換えます。
上記は、sedを使用するための基本的な例です。 実際、sedは、ファイルの操作など、はるかに複雑なワードプロセッシングシナリオで使用できます。
以下は、テキストの一部を含むファイルと、このコマンドでそれを処理した結果です。
$ sed "s / test / another test" ./myfile
テキストファイルとその処理結果
ここでは、上記で使用したのと同じアプローチが適用されますが、sedはファイルに保存されているテキストを処理するようになりました。 ただし、ファイルが十分に大きい場合、sedはデータをチャンクで処理し、ファイル全体が処理されるのを待たずに、処理された内容を画面に表示することに気付く場合があります。
Sedは、処理中のファイルのデータを変更しません。 エディターはファイルを読み取り、読み取った内容を処理して、出力をSTDOUTに送信します。 ソースファイルが変更されていないことを確認するには、sedに渡された後、それを開くだけで十分です。 必要に応じて、sedの出力をファイルにリダイレクトし、古いファイルを上書きする可能性があります。 入力ストリームと出力ストリームのリダイレクトを扱っているこのシリーズの以前の記事の1つに精通している場合は、これを実行できるはずです。
sedを呼び出すときにコマンドセットを実行する
データに対して複数の操作を実行するには、sedを呼び出すときに-eオプションを使用します。 たとえば、2つのテキストの置換を整理する方法は次のとおりです。$ sed -e "s / This / That /; s / test / another test /" ./myfile
sedを呼び出すときに-eスイッチを使用する
両方のコマンドは、ファイルのテキストの各行に適用されます。 それらはセミコロンで区切る必要があり、コマンドの終わりとセミコロンの間にスペースがあってはなりません。
sedを呼び出すときに複数のテキスト処理パターンを入力するには、最初の一重引用符を入力した後、Enterキーを押してから、最後の引用符を忘れずに新しい行に各ルールを入力します。
$ sed -e "> s / This / That /> s / test / another test /" ./myfile
これは、この形式で表示されるコマンドが実行された後に発生することです。
sedを操作する別の方法
ファイルからのコマンドの読み取り
テキストを処理するためのsedコマンドが多数ある場合は、通常、最初にそれらをファイルに書き出すのが最善です。 コマンドを含むファイルをsedに通知するには、-fスイッチを使用します。mycommandsファイルの内容は次のとおりです。
S / This / That / s / test / another test /
sedを呼び出して、エディターにコマンドを含むファイルと処理するファイルを渡します。
$ sed -f mycommands myfile
このようなコマンドを呼び出した結果は、前の例で得られたものと同様です。
sedを呼び出すときにコマンドでファイルを使用する
コマンドフラグを置き換える
次の例をよく見てください。$ sed "s / test / another test /" myfile
これがファイルの内容であり、sedがそれを処理するときに生成されるものです。
ソースファイルとその処理結果
replaceコマンドは通常、複数行で構成されるファイルを処理しますが、各行で検索されたテキストの最初の部分のみが置き換えられます。 パターンのすべての出現を置き換えるには、適切なフラグを使用する必要があります。
フラグを使用するときに置換コマンドを作成するための構文は、次のようになります。
S /パターン/置換/フラグ
このコマンドの実行は、いくつかの方法で変更できます。
- 番号を渡すとき、文字列内のパターンオカレンスのシーケンス番号が考慮されます。このオカレンスは置き換えられます。
- gフラグは、文字列内のパターンのすべての出現を処理する必要があることを示します。
- pフラグは、元の文字列の内容を出力する必要があることを示します。
- w fileフラグは、テキスト処理の結果をファイルに書き込むようにコマンドに指示します。
$ sed "s / test / another test / 2" myfile
置換するフラグメントの位置を指定してreplaceコマンドを呼び出す
ここでは、置換フラグとして番号2を指定しました。これにより、各行で2番目に出現する目的のパターンのみが置換されました。 それでは、グローバル置換フラグを試してみましょう-g:
$ sed "s / test / another test / g" myfile
出力からわかるように、このコマンドは、テキスト内のパターンのすべての出現箇所を置き換えました。
グローバル交換
p置換コマンドフラグは一致した行の出力を許可しますが、sedを呼び出すときに指定された-nオプションは通常の出力を抑制します。
$ sed -n "s / test / another test / p" myfile
その結果、この構成でsedを実行すると、特定のテキストが見つかった行(この場合は1行)のみが画面に表示されます。
置換コマンドフラグpの使用
テキスト処理の結果をファイルに保存できるwフラグを使用してみましょう。
$ sed "s / test / another test / w output" myfile
テキスト処理結果をファイルに保存する
コマンドの操作中にデータがSTDOUTに出力され、処理された行がwの後に名前が指定されたファイルに書き込まれることがはっきりとわかります。
区切り文字
/ etc / passwdで/ bin / bashを/ bin / cshに置き換えることを想像してみてください。 タスクはそれほど難しくありません:$ sed "s / \ / bin \ / bash / \ / bin \ / csh /" / etc / passwd
しかし、見た目はあまり良くありません。 スラッシュは区切り文字として使用されるため、sedに渡される行の同じ文字をエスケープする必要があります。 その結果、コマンドの可読性が低下します。
幸い、sedを使用すると、置換コマンドで使用する区切り文字を自分で設定できます。 区切り文字は、sの後に出現する最初の文字です。
$ sed "s!/ bin / bash!/ bin / csh!" / etc / passwd
この場合、感嘆符が区切り文字として使用され、コードが以前よりも読みやすく、よりクリーンになります。
処理するテキストフラグメントの選択
これまで、エディターに渡されたすべてを処理するためにsedを呼び出してきました。 場合によっては、テキストの一部のみをsedで処理する必要があります。特定の行または行のグループです。 この目標を達成するには、次の2つのアプローチがあります。- 処理する行数に制限を設定します。
- 処理する行に一致するフィルターを指定します。
$ sed "2s / test / another test /" myfile
sedを呼び出すときに指定された番号である1行のみを処理します
2番目のオプションは、文字列の範囲です。
$ sed "2,3s / test / another test /" myfile
行範囲の処理
さらに、replaceコマンドを呼び出して、ファイルが特定の行から最後まで処理されるようにすることができます。
$ sed "2、$ s / test / another test /" myfile
2行目から最後までファイルを処理する
replaceコマンドを使用して、指定されたフィルターに一致する行のみを処理するには、次のようにコマンドを呼び出す必要があります。
$ sed "/ likegeeks / s / bash / csh /" / etc / passwd
上で説明したことと同様に、テンプレートはコマンド名sの前に渡されます。
フィルタに一致する行の処理
ここでは、非常に単純なフィルターを使用しました。 このアプローチの可能性を完全に明らかにするために、正規表現を使用できます。 これらについては、このシリーズの次の記事のいずれかで説明します。
行を削除する
sedユーティリティは、文字列内の文字のシーケンスを他の文字に置き換えるだけではありません。 その助けを借りて、つまり、dコマンドを使用して、テキストストリームから行を削除できます。コマンド呼び出しは次のようになります。
$ sed "3d" myfile
テキストから3行目を削除します。 これはファイルではないことに注意してください。 ファイルは変更されません。削除はsedによって生成された出力にのみ影響します。
3行目を削除する
dコマンドを呼び出すときに削除する行番号を指定しない場合、ストリーム内のすべての行が削除されます。
dコマンドを一連の行に適用する方法は次のとおりです。
$ sed "2,3d" myfile
行の範囲を削除する
そして、与えられた行からファイルの終わりまで、行を削除する方法は次のとおりです。
$ sed "3、$ d" myfile
ファイルの終わりまでの行を削除します
次のパターンに従って、行を削除することもできます。
$ sed "/ test / d" myfile
パターンによる文字列の削除
dを呼び出すときに、いくつかのパターンを指定できます。パターンが発生する行と、それらの間にある行は削除されます。
$ sed "/ second /、/ four / d" myfile
パターンを使用して行の範囲を削除する
ストリームへのテキストの挿入
sedでは、iとコマンドを使用してデータをテキストストリームに挿入できます。- iコマンドは、指定された行の前に改行を追加します。
- コマンドは、指定された行の後に改行を追加します。
$ echo「別のテスト」| sed "i \ First test"
チームi
次に、コマンドを見てみましょう。
$ echo「別のテスト」| sed "a \ First test"
チームa
ご覧のとおり、これらのコマンドは、ストリームからのデータの前後にテキストを追加します。 途中に線を追加する必要がある場合はどうなりますか?
ここでは、ストリーム内の参照行の番号、またはテンプレートを指定することで支援されます。 ここでは、文字列を範囲としてアドレス指定することはできません。 新しい行を挿入する前の行番号を指定して、iコマンドを呼び出しましょう。
$ sed "2i \これは挿入された行です。" myfile
参照行番号を指定したiコマンド
コマンドで同じことをしましょう:
$ sed "2a \これは追加された行です。" myfile
参照行番号を使用してコマンドを実行します
iとコマンドの動作の違いに注意してください。 最初の行は指定された行の前に新しい行を挿入し、2番目の行は後に挿入します。
文字列の置換
cコマンドを使用すると、データストリーム内のテキスト行全体の内容を変更できます。 それを呼び出すときは、新しいデータをストリームに追加する代わりに、行番号を指定する必要があります。$ sed "3c \これは変更された行です。" myfile
文字列全体を置き換える
コマンドを呼び出すときにプレーンテキストまたは正規表現の形式のパターンを使用すると、パターンに一致するすべての行が置き換えられます。
$ sed "/ This is / cこれは変更されたテキスト行です。" myfile
文字列をパターンに置き換える
文字置換
yコマンドは個々の文字を操作し、呼び出されたときに渡されたデータに従ってそれらを置き換えます。$ sed "y / 123/567 /" myfile
文字置換
このコマンドを使用するときは、テキストストリーム全体に適用されることを考慮する必要があります。特定の文字の出現に制限することはできません。
行番号の表示
=コマンドを使用してsedを呼び出すと、ユーティリティはデータストリームの行番号を出力します。$ sed "=" myfile
行番号の表示
ストリームエディタは、内容の前に行番号を出力しました。
このコマンドにパターンを渡してsed-nスイッチを使用すると、パターンに一致する行番号のみが出力されます。
$ sed -n "/ test / =" myfile
パターンに一致する行番号を表示する
ファイルから挿入するデータを読み取る
上記では、sedを呼び出すときに、データをストリームに挿入し、何を挿入するかを指定する手法について説明しました。 ファイルをデータソースとして使用することもできます。 これを行うには、rコマンドを使用します。これにより、指定したファイルからストリームにデータを挿入できます。 呼び出すときに、ファイルの内容またはテンプレートを挿入する行番号を指定できます。例を考えてみましょう。
$ sed "3r newfile" myfile
ストリームへのファイルコンテンツの挿入
ここでは、newfileの内容がmyfileの3行目の後に挿入されています。
rコマンドを呼び出すときにテンプレートを使用すると、次のようになります。
$ sed "/ test / r newfile" myfile
rコマンドを呼び出すときにワイルドカードを使用する
ファイルの内容は、パターンに一致する各行の後に挿入されます。
例
そのような仕事を想像してみましょう。 特定の文字シーケンスがあり、それ自体は無意味であり、別のファイルから取得したデータに置き換える必要があるファイルがあります。 つまり、文字シーケンスDATAがプレースホルダーの役割を果たすファイルnewfileとします。 DATAの代わりとなるデータはデータファイルに保存されます。この問題は、sedストリームエディターのrコマンドとdコマンドを使用して解決できます。
$ Sed "/ DATA> /(r newfile d)" myfile
プレースホルダーを実際のデータに置き換える
ご覧のとおり、DATAプレースホルダーの代わりに、sedはデータファイルから出力ストリームに2行を追加しました。
結果
今日は、sedストリームエディターの操作の基本について説明しました。 実際、sedは大きなトピックです。 それを学ぶことは、新しいプログラミング言語を学ぶことと比較することができますが、基本を理解すれば、必要なレベルにsedを習得することができます。 結果として、それを使ってテキストを処理するあなたの能力はあなたの想像力によってのみ制限されます。それが今日のすべてです。 次回は、awkデータ処理言語について説明します。
読者の皆様! 日常業務でsedを使用していますか? はいの場合、あなたの経験を共有してください。
あなたの多くはおそらくあなたの目的のいくつかのためにsedストリームテキストエディタを使用しました、そうでなければ、私はそれについてあなたに話すことを嬉しく思います、私はより詳細にしようとします。 なぜストリーミングと呼ばれるのですか? 答えは簡単です。プログラムを通過する入力テキストドキュメントを想像してみてください。その結果、プログラムによって処理されるこのファイルの他の形式が作成されます。 一種の挽き肉-グリッドに基づいて肉を置く-あなたはミンチ肉か何か他のものを手に入れます。
したがって、デフォルトでは、このユーティリティはすでにシステムにインストールされているはずです(私の場合、Debian 7.6にすでにインストールされています)。そうでない場合は、-
テキスト付き:
最初の「s」パラメータは、テキストを置き換える必要があることを示します。g-置き換えられたテキストの最後にある-グローバルに(ファイル全体で)行う必要があることを示します。
たとえば、text.txtファイルでSergeyという単語をAndreyに置き換え、これをすべてtextout.txtファイルにアップロードする場合、次のように動作します。
sed "s / Sergey / Andrey / g"テキスト。 txt> textout。 txt |
結果:
特殊文字(たとえば、&文字)を置換する場合は、特殊文字の前に置く必要があります。 文字にバックスラッシュ「\」を付けます。sedが行の先頭に戻す必要があるものを指定する必要がある場合は、特殊文字「^」が使用されます。 さらに、1行に、セミコロン-";"で区切ることにより、2つ以上の変更を書き込むことができます。 たとえば、すでに変更されたtextout.txtファイルを拷問します。 まず、textout.txtファイルの現在の内容をもう一度表示します。
root @ testhostname:〜#cat textout.txt アンドレイのテスト アンドレイのテスト2 アンドレイのテスト3 |
次に、コマンドを入力します。
sed "s / for / \&/ g; s / ^ Test / Sergey / g"テキスト出力。 txt> textout2。 txt |
したがって、forという単語の代わりに、アイコン&(特殊文字は特殊文字の前に記号「\」を付けて入力します)、次に分離記号(sed'a-> "の1行にすべての変更を書き込むため)を配置します。 ; "、「テスト」の行頭の単語の代わりに、何が起こったかの結果であるセルゲイという単語を入れます。
私たちが望んでいたすべて!
したがって、ログを表示する場合、sedは優れたヘルパーです。 たとえば、今日の日付のすべての行(この場合は10月10日)をログ付きの/ var / log / messagesファイルからtestlog.txtファイルにアンロードする必要があります。次に進みましょう:
sed --n "/ ^ Oct 10 / p" / var / log / messages> testlog。 txt |
ここでは、-nパラメーターを追加し、次に-'/ ^ Oct 10 /-行は10月10日の日付から開始する必要があることを意味し、pパラメーター-印刷(この条件でコンテンツを印刷する)を意味し、ソースファイルと、フィルター条件に従って結果を破棄するファイルを実行し、10月10日にのみtestlog.txtファイルに含まれる内容を確認します。
罰金! 多くの行は必要ありませんが、条件付きで1行目から5行目までしか取得する必要がない場合は、現在のリクエストを記号「|」で区切ります。 testlog.txtファイルへのアップロードを削除し、sed -n 1.5pを書き込みます。これは、最初の「1」から5番目の「5」までを出力(p-式の最後に出力)する必要があることを意味します。 " ライン。 合計すると、次のようになります。
sed --n "/ ^ Oct 10 / p" / var / log / messages | sed-n 1、5p> testlog-5strok.txt |
もう一度、結果をアップロードするファイルが最後に移動されたという事実に注意を向けます(testlog-5strok.txt)。アクションの結果が表示されます。
sedストリームエディタは、標準入力またはファイルからの入力に対して操作を実行する非対話型のテキストエディタです。 Sedは情報を1行ずつ編集します。
sedエディターでの作業の基本について説明しました。 このガイドでは、より高度なテクニックについて説明します。
チームを組み合わせる
場合によっては、複数のコマンドを同時にsedエディターに渡す必要があります。 これはいくつかの方法で行われます。
sedを操作するためのテストファイルがまだない場合は、次の環境を作成します。
CD
cp / usr / share / common-licenses / BSD。
cp / usr / share / common-licenses / GPL-3。
エコー「これは終わらない歌です
それが何だったのかわからない
理由だけで... "> annoying.txt
sedは標準の入力と出力で動作するため、もちろん、同じ行でさまざまなsedコマンドを一緒に呼び出すことができます。
sed "s / and / \&/" annoying.txt | sed "s / people / horses /"
はい、それは続きます、私の友人
何頭かの馬がそれを歌い始めました
それが何だったのかわからない
&彼らは永遠にそれを歌い続けるでしょう
理由だけで...
このメソッドは機能しますが、sedへの複数の呼び出しはオーバーヘッドであり、より多くのスペースを占有し、sedの組み込み機能を使用しません。
-eオプションを使用して、複数のコマンドを同時にsedに渡すことができます。これは、各コマンドの前に挿入する必要があります。
sed -e "s / and / \&/" -e "s / people / horses /" annoying.txt
セミコロン文字を使用して、コマンドを文字列に連結することもできます。 この方法は、前の方法とまったく同じように機能します。
sed "s / and / \&/; s / people / horses /" annoying.txt
-eフラグを使用する場合は一重引用符を区切る必要があり、セミコロンを使用する場合はすべてのコマンドを一重引用符で囲むことができることに注意してください。
複数のコマンドを同時に呼び出すこれらの2つの方法は非常に便利ですが、単純なコマンドラインを使用する必要がある場合があります。
=演算子についてもよく理解しておく必要があります。 このステートメントは、既存の各行の間に行番号を挿入します。 結果は次のようになります。
sed "=" annoying.txt
1
これは終わらない歌です
2
はい、それは続きます、私の友人
3
何人かの人々はそれを歌い始めました
4
それが何だったのかわからない
5
そして彼らはそれを永遠に歌い続けるでしょう
6
理由だけで...
次に、テキストを編集して、番号付けの形式がどのように変化するかを確認してください。
Gコマンドは、デフォルトで、既存の行の間に空の行を追加します。
sed "G" annoying.txt
_
これは終わらない歌です
_
はい、それは続きます、私の友人
_
何人かの人々はそれを歌い始めました
_
それが何だったのかわからない
_
そして彼らはそれを永遠に歌い続けるでしょう
_
理由だけで...
これら2つのコマンドを組み合わせてみてください。 一見すると、これらのコマンドの出力には、テキスト行と数直線の間に空の行が含まれているように見える場合があります。 ただし、出力は次のようになります。
sed "=; G" annoying.txt
1
これは終わらない歌です
_
2
はい、それは続きます、私の友人
_
3
何人かの人々はそれを歌い始めました
_
4
それが何だったのかわからない
. . .
. . .
これは、=演算子が出力ストリームを変更するためです(つまり、結果の出力をそれ以上の編集に使用することはできません)。
これは、sedへの2回の呼び出しで回避できます。この場合、最初の呼び出しは2番目の呼び出しのプレーンテキストストリームとして扱われます。
sed "=" annoying.txt | sed「G」
1
_
これは終わらない歌です
_
2
_
はい、それは続きます、私の友人
_
3
_
何人かの人々はそれを歌い始めました
. . .
. . .
特に複数のコマンドを連結していて、出力が予想と異なる場合は、一部のコマンドが同じように機能することに注意してください。
高度なアドレス指定
アドレス指定可能なsedコマンドの利点の1つは、正規表現を基準として使用できることです。 これは、内容が正確にわかっていないファイルを操作できることを意味します。
sed "1,3s /.*/ Hello /" annoying.txt
こんにちは
こんにちは
こんにちは
それが何だったのかわからない
そして彼らはそれを永遠に歌い続けるでしょう
理由だけで...
代わりに、特定のパターンを含む行のみを検索する正規表現を使用できます。 これを行うには、コマンドの前に2つのスラッシュ(/)の間に検索パターンを配置する必要があります。
sed "/ singing / s / it /&loudly /" annoying.txt
これは終わらない歌です
はい、それは続きます、私の友人
大声で歌い始めた人もいます
それが何だったのかわからない
そして彼らはそれを永遠に大声で歌い続けるでしょう
理由だけで...
この例では、歌う単語を含むすべての行の最初の単語の前に、その単語を大声で配置します。 2行目と4行目はパターンと一致しないため、変更されないことに注意してください。
式のアドレス指定は複雑になる可能性があります。 これにより、コマンドがより柔軟になります。
次の例は、正規表現を使用して他のコマンドのアドレスを生成する方法を示しています。 このコマンドは、すべての空の行を検索して削除します。
sed "/ ^ $ / d" GPL-3
GNU GENERAL PUBLIC LICENSE
バージョン3、2007年6月29日
Copyright(C)2007 Free Software Foundation、Inc。
誰もが逐語的なコピーをコピーして配布することが許可されています
このライセンス文書の変更は許可されていません。
前文
GNU General Public Licenseは、無料のコピーレフトライセンスです。
. . .
. . .
正規表現は範囲のどの部分でも使用できることに注意してください。
たとえば、START行とEND行の間の行を削除できます。
sed "/ ^ START $ /、/ ^ END $ / d"入力ファイル
このコマンドは、最初に見つかったSTARTワードから最初に見つけたENDワードまでのすべての行を削除し、その後、STARTという単語に再び遭遇した場合、データの削除を続行することに注意してください。
アドレス指定を反転するには(つまり、パターンに一致しない行を選択する)、感嘆符(!)を使用します。
たとえば、完了した行を削除するには、次のように入力します。
sed "/ ^ $ /!d" GPL-3
アドレスは、反転するために複雑な式である必要はありません。 反転は、通常の番号付けでも同じように機能します。
追加のバッファを使用する
追加のホールドバッファにより、sedの複数行編集機能が向上します。
追加のバッファーは、特定のコマンドで変更できる一時的なストレージ領域です。
この追加のバッファがあると、他の文字列で作業しているときに文字列を保存できます。
バッファを操作するためのコマンド:
- h:現在の処理バッファー(作業中の最後に一致した行)を追加のバッファーにコピーします。
- H:現在の追加処理の最後に現在の処理バッファを\ nで区切って追加します。
- g:現在の追加バッファを現在の処理バッファにコピーします。 以前の処理バッファは失われます。
- G:現在のパターンを現在の処理バッファに\ nで区切って追加します。
- x:現在のテンプレートと追加のバッファーを交換します。
追加のバッファーの内容は、処理バッファーに移動されるまで操作できません。
複雑な例を考えてみましょう。
次のコマンドで隣接する線を結合してみてください。
sed -n "1〜2h; 2〜2(H; g; s / \ n / /; p)" annoying.txt
ノート:実際、sedはこのための個別の組み込みNコマンドを提供します。 しかし、実際には、この例を検討すると便利です。
-nオプションは、自動出力を抑制します。
1〜2h-最初の行(つまり、すべての奇数行)から開始して、テキストの2行ごとに順次置換を実行するアドレス定義。 hコマンドは、一致した行を追加のバッファーにコピーします。
コマンドの残りの部分は中括弧で囲まれています。 これは、コマンドのこの部分が、指定されたばかりのアドレスを継承することを意味します。 これらの括弧がないと、Hコマンドのみがアドレスを継承し、残りのコマンドは各行に対して実行されます。
もちろん、前述のNビルトインははるかに短く単純であり、同じ結果を返します。
sed -n "N; s / \ n / / p" annoying.txt
これは終わらない歌ですイエス、それは続く、私の友人
何人かはそれが何であるかを知らずにそれを歌い始めました
そして彼らは「それを永遠に歌い続けるでしょう...
sedスクリプト
コマンドを組み合わせてスクリプトにすることができます。 これにより、単一のターゲットテンプレートで一連のコマンド全体を実行できます。
たとえば、事前にフォーマットする必要のある簡単なテキストメッセージを作成するスクリプトを作成できます。
そうすれば、メッセージごとに同じコマンドを常に繰り返す必要はありません。 基本的に、sedスクリプトは、特定のオブジェクトに適用されるコマンドのリストです。
例えば:
s / this / that / g
s /雪/雨/ g
1.5秒/松ぼっくり/アプリコット/ g
次に、ファイルを呼び出すことができます。
sed -f sedScriptName fileToEdit
結論
これで、sedを操作するためのより高度な方法がわかりました。
最初は、sedコマンドは理解しにくく、混乱しやすいものです。 したがって、重要なデータで使用する前に、それらを試してみることをお勧めします。
タグ:、