次のコードが何を意味するのかわかりますか?
sed 's/ \([0-9]\)\/\([0-9]\) / \2\/\1 /' filename
ありがとう
答え1
sed 's/ \([0-9]\)\/\([0-9]\) / \2\/\1 /' filename
これはほとんどのUnixシェルで有効なコードです。
シェルでは、空白文字は構文内のトークンを区切るために使用されます'...'
。引用する/脱出するシェルの文字列の意味文字の特別な意味を削除。この場合、これは'...'
シェルがスペースやバックスラッシュ文字を特に処理しないことを意味します。
最初の単語sed
isはシェル構文のキーワードではなく、シェルはその行を単純なコマンド呼び出しとして解釈します。 、およびを引数として findsed
コマンドを分岐し$PATH
、子プロセスで見つかった最初のコマンドを実行します。sed
s/ \([0-9]\)\/\([0-9]\) / \2\/\1 /
filename
sed
それ自体が他の言語、言語の通訳者ですsed
。
-e
あるいは、オプションでスクリプトが渡されない限り、受け取ったオプションではない-f
最初の引数は、sed
解釈されるスクリプトとして扱われます。
ここにいるs/ \([0-9]\)\/\([0-9]\) / \2\/\1 /
。
sed
filename
入力(ここではファイル)を一度に1行ずつ処理し(現在行がロードされているパターンスペースでsed
)、各行に提供されているスクリプトのコードを解釈し、結果のパターンスペースをstdoutに印刷します。
ここで、スクリプトは 1 つのコマンドであるsed
ubstitutes
コマンドで構成されます。
構文は、s%pattern%replacement%flags
すべての文字を代わりに使用できることです%
。
ここで、著者はを代わりに/
使用します%
。これは最も一般的に使用されますが、ここでは/
パターンと置換に使用されるため、 を使用してエスケープする必要があるため、間違った選択です\
。
したがって、パターンはです" \([0-9]\)/\([0-9]\) "
。sed
基本正規表現(着替え)。ブレイから:
- SPC、
/
特別ではないので合わせてみてください [set]
一致する要素の構成指定されたコレクションにあります。セットに含まれている場合x-y
と間に配置された対照要素と一致します。たとえば、0123456789文字以上を含める必要がありますが、ロケール、オペレーティングシステム、および実装によっては多くの場合があります。x
y
0-9
sed
\(...\)
グループ化にも使用されます。捕獲。つまり、内部コンテンツと一致するコンテンツは、キャプチャされますそして提供される代替\1
最初のキャプチャグループ、\2
2番目のキャプチャグループなど。
ここで置き換える項目は、パターンマッチングの最初の2つのキャプチャグループが" \2/\1 "
どこにあり、何である\2
かです。\1
g
あなたの場合、特に(ローカル用の)フラグが提供されていないため、フラグのリストが空であるため、1行g
に最初の一致のみが置き換えられます。
<SPC><a-digit><slash><another-digit><SPC>
したがって、ここでは<SPC><another-digit><slash><a-digit><SPC>
各行で最大1つずつ置き換え、filename
結果を標準出力に印刷するという意味です。
たとえば、aには次のものがfilename
含まれます。
a 1/2 b 3/4
test
c4/5 6/7 d
次のように出力されます。
a 2/1 b 3/4
test
c4/5 7/6 d
¹例外には、バックスラッシュと改行文字、およびsed
マルチバイト文字のいくつかの実装が含まれます。また、非ASCII文字を避ける必要があり、非ASCII文字を含めるためにパターンまたは置換が必要な場合、つまりエンコードされた文字が他の文字の中に見つからない場合、!"#$%&' ()*+,-./:;<=>?
実際にはASCII制御文字も除外した場合にのみ残ります。