对文本中的特定行进行排序

时间:2012-07-14 12:30:17

标签: sorting vim emacs vi nano

我有给定的文字:

# Blub
Hello this is a blub text.

# Bla
This is the bla text.

# Abba
Another text.

是否可以使用#对行进行排序?因此生成的文本是:

# Abba
Another text.

# Bla
This the bla text.

# Blub
Hello this is a blub text.

最好使用vim或emacs。

3 个答案:

答案 0 :(得分:5)

在Emacs中,

  1. M-X sort-regexp-fields
  2. 输入:#[^#]*
  3. 输入:\&
  4. 第一个正则表达式用于分隔记录,第二个用于指定用于排序的键。

    如果您可以自由选择标记字符并使用*而不是#,则可以使用org-mode的命令org-sort-entries,这样可以避免进入正则表达式

答案 1 :(得分:0)

类似的东西:

:sort! /^#.+\n.+\n$/ 

我不确定行块顺序。

答案 2 :(得分:0)

你没有这样标记,但我认为awk是这项工作的最佳工具。使用gawk以下作品:

gawk RS='\n\n' '{ 
  gsub("\n$", "")
  gsub("\n", "@")
  print 
}' file_to_be_sorted | sort | sed -e 's/$/\n/' -e 's/@/\n/'

解释

通过将记录分隔符(RS)设置为'\ n \ n',gawk从每个块创建记录。每条记录都转换为一行,@作为分隔符(gsub("\n", "@")),此时正常sort有效。然后使用sed重新创建块。 gsub("\n$", "")修复了最后一条记录的空白问题。

注意:如果任何块包含@,则需要选择其他分隔符。