在数字字段之前或紧接数字字段之后的字母数字字段之前插入换行符

在数字字段之前或紧接数字字段之后的字母数字字段之前插入换行符

我有这条线

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 提供了完整的答案。所以功劳归他所有!

相关内容