1
sed "s/\(^[a-z,0-9]*\)\(.*\)\( [a-z,0-9]*$\)/\1\2 \1/g" desired_file_name

一部だけを説明したり、少なくとも次のように言葉で構成したりしても、私はそれを高く評価しますs\alphanumerical_at_start\something\alphanumerical_at_end\something_else\global

誰かがそれが何を意味するのか、なぜそしてすべての正規表現がとても...ひどいのか説明できますか?

最初の小文字の英数字の単語が最後の単語に置き換えられることを知っています。しかし、ここで何が起こっているのか少しずつ説明していただけますか? /\andとその他のすべては\(.*\)\何ですか?

私はただ迷っています。

編集:これが私が得たものです:(^[a-z0-9]*)トラフ z と 0 トラフ 9 で始まります。と[a-z,0-9]*$同じですが、最後の単語です (ただし、[0-9,a-z]= 最初の 2 文字 / 最初の文字、または単語全体 ?)。また: とは*どういう\(.*\)\意味ですか?

4

4 に答える 4

2

これは sed の検索と置換です。形式としてs/search/replace/flags、唯一のフラグはg検索/置換がグローバルであることを意味するため、一致が最初の行だけではなく単一の行で複数回発生した場合.

まず、検索する正規表現は次のとおりです。

\(^[a-z,0-9]*\)\(.*\)\( [a-z,0-9]*$\)

または、より読みやすい形式で:

\(             # start capture group 1
  ^              # match at the beginning of the line
  [a-z,0-9]*     # zero or more alphanumeric or comma characters (lowercase only)
\)             # end capture group 1
\(             # start capture group 2
  .*             # zero or more of any character (except for newlines)
\)             # end capture group 2
\(             # start capture group 3
  [ ]            # literal ' ' character (I added brackets for clarity)
  [a-z,0-9]*     # zero or more alphanumeric or comma characters (lowercase only)
  $              # match at the end of the line
\)             # end capture group 3

交換品は次のとおりです。

\1\2 \1

これにより、行全体が (正規表現の^および$アンカーのため) キャプチャ グループ 1 の内容に置き換えられ、その後にキャプチャ グループ 2 の内容、スペース、キャプチャ グループ 1 の内容が続きます。

于 2012-06-05T16:59:07.107 に答える
1
s/\(^[a-z,0-9]*\)\(.*\)\( [a-z,0-9]*$\)/\1\2 \1/g

s -> substitute
/ -> begin of regex
\( -> begin of a first field( accessed as \1 later)
^  -> from the begining of line in data
[a-z,0-9] -> list of characters which will be compared, lowercase a through z, comma, and 0 through 9
* -> zero or more times
\) -> end of \1 field
\( -> begin of \2
.* -> . means any character. .* means any character zero or more times
\) -> end of \2
\( [a-z,0-9]*$ -> begin of \3, followed by a space, follwed by zero or more a-z, comma, 0-9
\) -> end of \3 field
/ -> end of regex to replace

/ -> begin of regex to replace with
\1\2 \1 -> first field followed by second field followed by a space and again the first field
/ -> end of regex to replace with

g -> globally
于 2012-06-05T17:03:22.323 に答える
1

正規表現は、正規文法を記述する方法です。彼らはこれを非常に簡潔で非常に効率的な方法で達成します。これにより、複雑に見えます。

また、それらは構造化されており、デコード可能です。

まず、sed電話があります。

sed "{operation}/{expression}/{replacement}/{modifiers}" {argument}

ノート

  • sedスラッシュでパーツを区切ります。つまり、エスケープされていないスラッシュを{expression}orに含めることはできません{replacement}
  • 他のほとんどの正規表現ダイヤルとは異なり、sed括弧を使用して実際の括弧に一致させ、エスケープされた括弧を使用してキャプチャ グループを定義します。

{operation}たまたま-s代用。

{expression}is は、次の\(^[a-z,0-9]\)\(.*\)\( [a-z,0-9]*$\)ように分解されます。

\( # キャプチャ グループ 1 を開始
  ^ # 文字列の先頭に一致
  [az,0-9] # 文字 a ~ z と 0 ~ 9 とコンマ (!) に一致
\) # キャプチャ グループ 1 の終了
\( # キャプチャ グループ 2 を開始
  .* # 任意の文字 (.) に一致、0 回以上 (*)
\) # キャプチャ グループ 2 の終了
\( # キャプチャ グループ 3 を開始
               # スペースにマッチ
  [az,0-9]* # 文字 a ~ z と 0 ~ 9 とコンマ (!) に一致
  $ # 文字列の末尾に一致
\) # キャプチャ グループ 3 の終了

少し考えてみてください。同じことを行う関数を作成するのにどれだけのコード (および時間) が必要で、正規表現に必要なスペースはどれだけ少ないでしょうか。そのため、非常に圧縮されているため、読みにくくなっています。

{replacement}です\1\2 \1。_ \nは後方参照と呼ばれ、nはキャプチャ グループの番号です。したがって、これにより、グループ 1 と 2 のコンテンツ、スペース、およびグループ 1 のコンテンツが再び挿入されます。

この{modifiers}部分はg、正規表現を可能な限り頻繁に適用させるフラグです。この特殊なケースでは、上記の正規表現は一度しか一致しないため、あまり意味がありません。

于 2012-06-05T17:01:46.013 に答える
1
  • (^[az,0-9]) - 行頭の英数字またはコンマ (グループ 1)
  • (.) - 任意の文字 (グループ 2)
  • ( [az,0-9]*$) - スペースの後に 0 個以上の英数字またはコンマが続きます [コンマは単なるエラーだと思います]、行末まで
  • \1\2 \1 - (グループ 1)(グループ 2) スペース (グループ 1) で置換
  • g - 入力のどこでも
于 2012-06-05T16:52:00.793 に答える