数字フィールドの前または数字フィールドの直後に英数字フィールドの前に改行を挿入する

数字フィールドの前または数字フィールドの直後に英数字フィールドの前に改行を挿入する

この行があります。

word1 word2 1234 4567 word3 8901 word4 word5 2541 5142 word5

数字フィールドの前または数字フィールドの後の英数字フィールドの前に改行文字が挿入されるように、この行を分割したいと思います。その後、出力は次のようになります。

word1 word2
1234
4567
word3
8901
word4 word5
2541 
5142 
word5

すべての英数字フィールドは文字で始まります。

答え1

英数字の単語の間のスペースを保持し、他のすべての単語を改行文字に変換したいように聞こえます。

perl -pe 's{([^\d\s]\S*\s+)(?=\S*[^\d\s])|\s+}{$1//"\n"}ge'

答え2

echo "word1 word2 1234 4567 word3 8901 word4 word5 2541 5142 word5" |perl -pe 's/(\s)([0-9]+)/$1\n$2/g; s/(\s)([0-9]+)(\s+)([a-zA-Z])/$1$2\n$4/g;'

説明する:

  • perl -pe:各入力行に対して次のPerlスクリプトを実行し、結果を印刷します。
  • s/(\s)([0-9]+)/$1\n$2/g: スペース + 数値フィールド -> スペース +新しいチーム+数値フィールド
  • s/(\s)([0-9]+)(\s+)([a-zA-Z])/$1$2\n$4/g: スペース + 数値フィールド + スペース + 英数字フィールド -> スペース + 数値フィールド +新しいチーム+ 英数字フィールド
  • 各交換の終わりはg「グローバル」を意味します。行全体に対してこれを行います。

答え3

awkスクリプトに次のコードを入力してください。スクリプトが呼び出されたとします。 do_magic.awk

#!/usr/bin/awk -f

{
  str=$1
   for (i=2;i<=NF;++i) 
      if ($i ~ /^[0-9]+/) str = str "\n" $i "\n"
      else str = str " " $i
       gsub(/\n[[:space:]]*/,"\n",str)
       print str
}

呼び出しスクリプトの使用

do_magic.awk yourfile

結果:

word1 word2
1234
4567
word3
8901
word4 word5
2541
5142
word5

PS:効果的な解決策が見つかりました。geirha 完全な回答は freenode #awk で確認できます。だからすべての功績が彼に戻ります!

関連情報