この行があります。
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 で確認できます。だからすべての功績が彼に戻ります!