sed、awk、perl、またはbashを使用して文字列を2つの部分に分割します。

sed、awk、perl、またはbashを使用して文字列を2つの部分に分割します。

次の文字列があります。

Grades ABCDEF-123456

この文字列を以下のように2つの部分に分割したいと思います。

Grades ABCDEF
Grades 123456

Bashでどうすればいいですか?

答え1

echo Grades "ABCDE-12345" | sed 's/-/ /g' | awk '{ print $1" "$2"\n"$1" "$3'}
Grades ABCDE
Grades 12345

または@steeldriverによると

awk -F'[ -]' '{print $1, $2; print $1, $3}'

答え2

シェルでこれを完全に実行することもできます。

text="Grades ABCDEF-123456"

本文を分割します。必要に応じてキャプチャできますが、ここでは削除します。

grades="${text#* }"

これでこれら2つの部分を変数として抽出できますが、今は印刷するだけです。

echo "Grades ${grades%-*}"
echo "Grades ${grades#*-}"

1つの出力ステートメントに組み合わせることもできますが、読みやすくないと思います(printf一部のテキストカテゴリよりも安全です)。echo

printf "Grades %s\nGrades %s\n" "${grades%-*}" "${grades#*-}"

答え3

ダッシュを改行文字に置き換え、その後に最初のフィールドを入力します。

perl -alpe 's/-/\n$F[0] /' 

答え4

使用幸せ(以前のPerl_6)

~$ raku -ne 'my @a = .split("-", 2); put "@a.[0]\n", @a.[0].words[0], " @a.[1]";'   file
Grades ABCDEF
Grades 123456

#OR:

~$ raku -ne '.split("-", 2) andthen put "$_.[0]\n", $_.[0].words[0], " $_.[1]";'   file
Grades ABCDEF
Grades 123456

RakuはPerlファミリーのプログラミング言語です。 RakuはPerlよりもコマンドラインフラグを少なくします。上記の楽断線は-ne自動印刷されていない線で表示されているそうです。

最初の答え:1行ずつ入力すると、ハイフン.splitで部分を分割-して配列に割り当てます。これは、テーマ変数(この場合は行テキスト)のルーチンを呼び出す略語です。配列に入ったら、データを正しい出力形式に調整するだけです。 Rakuのルーチンは余白のテキストを壊します。したがって、最終呼び出しは次のように理解できます。2@a.split$_.split$_@awordsput

  1. "@a.[0]\n"最初の要素を印刷し、@aその後に改行文字を印刷します。
  2. @a.[0].words[0]次の行に、最初の要素の最初の単語を印刷します。
  3. " @a.[1]"同じ(2番目の)行にスペースを印刷してから2番目の要素を印刷します@a

2番目の答え:使いやすいと思われる場合$_ トピック変数、配列割り当てを放棄し、同じ出力を得ることができます。上記の2番目の答えはオプションであり、$_コードをさらに短縮できます。必要なのは、Rakuがトピック変数からルーチン/インデックスを呼び出す.ことを理解する主なポイントです。$_

最後に、さまざまなテキストフラグメントに主要な「プレフィックス」を追加するのは一般的な作業です。キーと値のペアが満足で基本的な順序を適用できる場合、次のコードは概念的に簡単です(\t区切り列を返す)。

~$ raku -ne 'my %hash = .words[0] => .words[1].split("-", 2);  \
             for %hash.sort {.antipairs.put for .invert };'   file
Grades  ABCDEF
Grades  123456

https://docs.raku.org/routine/split
https://docs.raku.org/routine/invert
https://raku.org

関連情報