我有这条线
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:我想出了一个可行的解决方案。在 freenode #awk 上,geirha
提供了完整的答案。所以功劳归他所有!