テキストファイルの名前リストで初期名を省略します。

テキストファイルの名前リストで初期名を省略します。
Washington George
Adams John
Jefferson Thomas
Madison James

期待される:

W. George
A. John
J. Thomas
M. James

sed私は多くのGoogle検索で使用したいくつかのパターンを試しました。

\<      # match start of word
\>      # match end of word

's/[^a-z]././'
's/.....\>/./'

初めて登場した後、次の単語まで文字をつかむのに苦労しています。

答え1

次のコマンドを使用できますsed

$ sed 's/^\(.\)[^ ]*/\1./' file
W. George
A. John
J. Thomas
M. James

またはもっと簡潔に言えば:

$ sed -E 's/^(.)[^ ]*/\1./' file
W. George
A. John
J. Thomas
M. James

できること:

  • 最初の文字をキャプチャします^(.)
  • 次に、空白ではなく次の文字を選択します[^ ]*
  • 前のパターンをキャプチャされた文字と点で置き換えます。

\1最初のキャプチャグループを表します(.)。複数回キャプチャでき、各キャプチャは\1最初のキャプチャ、\22番目のキャプチャなどの増分数で表示されます。-Eバックスラッシュエスケープフラグなしでパターンを括弧で囲み、キャプチャを実行します。

答え2

最初の小文字のセットをドットに変更したいようです。

デフォルトの正規表現を使用して、小文字のみを含む最初の部分文字列を一致させることでこれを行うことができます。

$ sed 's/[[:lower:]]\{1,\}/./' file
W. George
A. John
J. Thomas
M. James

またsed、このオプションと組み合わせて使用​​すると、ほとんどの実装で拡張正規表現がサポートされます-E

$ sed -E 's/[[:lower:]]+/./' file
W. George
A. John
J. Thomas
M. James

これは、省略したい名前がすべて大文字で始まると仮定します。幸いなことに、このような状況は一般的なことです。

答え3

Raku(以前のPerl_6)の使用

perl6 -pe 's/^^ (\w+) /{$0.comb[0]}./;' 

入力例:

Washington George
Adams John
Jefferson Thomas
Madison James

出力例:

W. George
A. John
J. Thomas
M. James

簡単に言うと、行の先頭から一致をs///要求するRakuの代替演算子を使用して、最初の単語をキャプチャ変数にキャプチャします。代わりに、Rakuは中かっこ内のコードを実行するように指示されます。ここで、変数-ingは単一文字としてキャプチャされ、最初の文字が使用され、最後にリテラルピリオドが印刷されます。^^\w+(…)$0{…}comb$0[0].

(もちろん)単に文字をキャプチャして大文字で要求することもできます。

raku -pe 's/^^ (<upper>) \w* /$0./;'

2番目のサンプルコード(上)は、OPのサンプル入力と同じ出力を提供しますが、大文字で表記されていない名前(「de」など)を変更せずにそのままにするという利点もありますde Gaulle Charles

https://docs.raku.org/syntax/s$SOLIDUS$SOLIDUS$SOLIDUS
https://raku.org

関連情報