次の文字列があります。
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
$_
@a
words
put
"@a.[0]\n"
最初の要素を印刷し、@a
その後に改行文字を印刷します。@a.[0].words[0]
次の行に、最初の要素の最初の単語を印刷します。" @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