「sed」コマンドについて学ぶ

「sed」コマンドについて学ぶ

ファイルにnames「名前」形式の名前のリストが1行に1つずつ含まれているとします。これらの名前はソートされず、性順にソートされることを望みます。ただし、各行の名前形式は同じままにする必要があります。どの一つ次のコマンドはいいえ正しくソートされた名前のリストをコンソールに出力しますか?

[ ]cut -f 2 -d " " names | paste names - | sort -k 3 | cut -f 1

[x]sort -k 2 names ←誤解

[ ]sed 's/\(\w*\) \(\w*\)/\2 \1 \2/' names | sort | cut -f 2-3 -d " "

[ ]cut -f 2 -d " " names | sort

[ ]cut -f 2 -d " " names | paste - names | sort | cut -f 2

以下が要求された出力をどのように生成するのか理解できません。

sed 's/\(\w*\) \(\w*\)/\2 \1 \2/' names | sort | cut -f 2-3 -d " "

IEは、名前を姓に基づいてアルファベット順にソートしますが、「名前の姓」形式を維持します。\w職業の次のステップは何ですか*?ファイル名の後にスペースがあるはずです。これにはどのように\w適用されますか?

ベストアンサー1

以下はGNUにのみ適用され、sedBSDsedの動作は異なります。

いいですね。段階的に見て、次の目的で試してみましょうnames

Alice Zylanzy
Zepher Applecart
Michael Copperside

このコマンドを使用し、それがどのように機能するかを段階的に見ていきます。

$ sed 's/\(\w*\) \(\w*\)/\2 \1 \2/' names
Zylanzy Alice Zylanzy
Applecart Zepher Applecart
Copperside Michael Copperside

したがって、このsedコマンドは行の前に繰り返される姓を追加します。その後、簡単な作業を行いますsort

$ sed 's/\(\w*\) \(\w*\)/\2 \1 \2/' names | sort
Applecart Zepher Applecart
Copperside Michael Copperside
Zylanzy Alice Zylanzy

素敵ですね。これで性別に並べられました。今、私たちがcut使用したプレフィックスを削除するために使用します。

$ sed 's/\(\w*\) \(\w*\)/\2 \1 \2/' names | sort | cut -f 2-3 -d " "
Zepher Applecart
Michael Copperside
Alice Zylanzy

..彼らが言ったように、ボブはあなたのおじさんです。

雑草の中へどのようにコマンドsedは動作します: \wは、「単語文字」を意味する魔法の呪文であり、の略語です/[0-9A-Za-z_]/\w*ゼロ個以上の「単語文字」を意味し、これが名前がグループ化される方法です。すべての名前に下線や数字がないと仮定すると、次のように書き直すことができます。

sed 's/\([A-Za-z]*\) \([A-Za-z]*\)/\2 \1 \2/' names

sedコマンド全体のセクションをセクションごとに分類すると、次のようになります。

sedコマンドsは、「検索と置換」または「交換」コマンドです。最初と2番目のsの間の式は、/2番目と3番目のs/の間の式に置き換えられます。

だから私たちはこれを置き換えます:

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (                        group and capture to \1:
    \w*                      word characters (a-z, A-Z, 0-9, _) (0 or
                             more times (matching the most amount
                             possible))
  )                        end of \1
                           ' '
  (                        group and capture to \2:
    \w*                      word characters (a-z, A-Z, 0-9, _) (0 or
                             more times (matching the most amount
                             possible))
  )                        end of \2

これで:

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  \2                       what was matched by capture \2
                           ' '
  \1                       what was matched by capture \1
                           ' '
  \2                       what was matched by capture \2

おすすめ記事