sed 's/ \([0-9]\)\/\([0-9]\) / \2\/\1 /' ファイル名 [閉じる]

sed 's/ \([0-9]\)\/\([0-9]\) / \2\/\1 /' ファイル名 [閉じる]

次のコードが何を意味するのかわかりますか?

sed 's/ \([0-9]\)\/\([0-9]\) / \2\/\1 /' filename

ありがとう

答え1

sed 's/ \([0-9]\)\/\([0-9]\) / \2\/\1 /' filenameこれはほとんどのUnixシェルで有効なコードです。

シェルでは、空白文字は構文内のトークンを区切るために使用されます'...'引用する/脱出するシェルの文字列の意味文字の特別な意味を削除。この場合、これは'...'シェルがスペースやバックスラッシュ文字を特に処理しないことを意味します。

最初の単語sedisはシェル構文のキーワードではなく、シェルはその行を単純なコマンド呼び出しとして解釈します。 、およびを引数として findsedコマンドを分岐し$PATH、子プロセスで見つかった最初のコマンドを実行します。seds/ \([0-9]\)\/\([0-9]\) / \2\/\1 /filename

sedそれ自体が他の言語、言語の通訳者ですsed

-eあるいは、オプションでスクリプトが渡されない限り、受け取ったオプションではない-f最初の引数は、sed解釈されるスクリプトとして扱われます。

ここにいるs/ \([0-9]\)\/\([0-9]\) / \2\/\1 /

sedfilename入力(ここではファイル)を一度に1行ずつ処理し(現在行がロードされているパターンスペースでsed)、各行に提供されているスクリプトのコードを解釈し、結果のパターンスペースをstdoutに印刷します。

ここで、スクリプトは 1 つのコマンドであるsedubstitutesコマンドで構成されます。

構文は、s%pattern%replacement%flagsすべての文字を代わりに使用できることです%

ここで、著者はを代わりに/使用します%。これは最も一般的に使用されますが、ここでは/パターンと置換に使用されるため、 を使用してエスケープする必要があるため、間違った選択です\

したがって、パターンはです" \([0-9]\)/\([0-9]\) "sed基本正規表現(着替え)。ブレイから:

  • SPC、/特別ではないので合わせてみてください
  • [set]一致する要素の構成指定されたコレクションにあります。セットに含まれている場合x-yと間に配置された対照要素と一致します。たとえば、0123456789文字以上を含める必要がありますが、ロケール、オペレーティングシステム、および実装によっては多くの場合があります。xy0-9sed
  • \(...\)グループ化にも使用されます。捕獲。つまり、内部コンテンツと一致するコンテンツは、キャプチャされますそして提供される代替\1最初のキャプチャグループ、\22番目のキャプチャグループなど。

ここで置き換える項目は、パターンマッチングの最初の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制御文字も除外した場合にのみ残ります。

関連情報