sedコマンドで使用される次のスクリプトの実際の機能が何であるかを知りたいです。
sed -e 's:<F0_M>:<o,f0,male>:' \
-e 's:<F0_F>:<o,f0,female>:' \
-e 's:([0-9])::g' \
-e 's:<sil>::g' \
-e 's:([^ ]*)$::' | \
最初と2番目のスクリプトは、テキストタイプ<F0_F>
を<o,f0,female>
。'::','g' and '$'
ほとんどのドキュメントでは、ほとんどのスクリプトで「\」と「/」を使用しています。しかし、ここでは':'
スラッシュの代わりにスラッシュを使用しました。誰かが上記の3つのスクリプトを説明できますか?
答え1
基準区切り記号sed
コマンドに使用されるのは、/
次のコマンドのようなものです。
sed -e s/foo/bar/g < input > output
ただし、s
コマンドの後に他の文字が続く場合それその特定の表現の区切り記号になります。
/
区切り文字自体をコマンドに表示する必要がある場合は、区切り文字ではなく文字を使用するのが一般的なので注意が必要です。逃げる。たとえば、/
Unixパスを処理するスクリプトで区切り文字を処理するのは面倒です。
ここではそうでないようで、コマンドの作成者が:
コマンドの区切り文字としてこれを好んだと仮定しますsed
。
コマンドには5つの表現があります。
s:<F0_M>:<o,f0,male>:
<F0_M>
これにより、各入力行の最初のインスタンスが出力<o,f0,male>
の最初のインスタンスに置き換えられます。その行への入力に複数の一致がある場合は、後続の一致が保持されます。
一重引用符は、単にシェルが式の文字を解釈するのを防ぎます。どちらも文字通りsed
コマンドに渡されます。
s:<F0_F>:<o,f0,female>:
上記の状況と同様に、明らかに理性を狙っただけです。
s:([0-9])::g
入力行から括弧内の単一の数字をすべて削除します。
前の2つの式とは異なり、この式は末尾がg
「グローバル」を意味するため、各行のすべてのインスタンスに影響します。
1桁の数字でのみ機能します。(42)
たとえば、では何もしません。
s:<sil>::g
<sil>
出力を作成するときは、各入力行からすべてのインスタンスを削除します。
s:([^ ]*)$::
行末にスペースがない場合、行末の角かっこ文字は削除されます。また、行の末尾にある空の角かっこペアを削除します。
sed
これらのトピックと正規表現に関する完全な本があります。単一の答えは、トピック全体を学習するのに実際には適していません。
上記の式は実際にはこの点で少し面倒です。$
正規表現(または減らして正規表現)を行の終わりと^
行の先頭に固定しますが、その式^
の意味は異なります。
私はあなたが読むことを提案します正規表現をマスターする著者:ジェフリー・フリーデル。