将文本从一行复制到另一行

时间:2014-12-29 18:30:51

标签: regex linux unix awk

我有示例文件:

<i>text</i>
verse 19 3 1 text2
verse 19 3 2 text3
<i>text4</i>
verse 19 4 1 text5
verse 19 4 1 text6
verse 19 4 1 text7

我需要将其转换为:

pericope 19 3 1 <i>text</i>
verse 19 3 1 text2
verse 19 3 2 text3
pericope 19 4 1 <i>text4</i>
verse 19 4 1 text5
verse 19 4 1 text6
verse 19 4 1 text7

如何为此构建正则表达式?

2 个答案:

答案 0 :(得分:1)

您可以使用awk

awk '/<i>/{p=$0;next} p{s=$0; sub(/ +[^ ]+$/, "", s); print "pericope", s, p; p=""} 1' file
pericope verse 19 3 1 <i>text</i>
verse 19 3 1 text2
verse 19 3 2 text3
pericope verse 19 4 1 <i>text4</i>
verse 19 4 1 text5
verse 19 4 1 text6
verse 19 4 1 text7

说明:

  • 当您获得p
  • 的行时,在变量<i>中保存行
  • 从下一行开始删除最后一个字段并打印"pericope", s, p
  • p初始化为""
  • 使用默认操作1
  • 打印下一行

答案 1 :(得分:0)

假设您在vim中执行此操作并从文本标记后的第一行获取数字,则此正则表达式可以正常工作:

:%s/\(<i>text\d\?<\/i>\n\)\(verse\(\(\s\+\d\+\)\{3}\)\)/periscope\3 \1\2