gpt4 book ai didi

emacs - 使用 elisp 处理文本

转载 作者:太空宇宙 更新时间:2023-11-03 18:36:00 24 4
gpt4 key购买 nike

自从我皈依了 Emacs 教会以来,我一直在尝试从它里面做所有事情,我想知道如何用它快速有效地进行一些文本处理。

例如,让我们以我几分钟前在 org-mode 上编辑的这个列表为例。

** Diego: b QI** bruno-gil: b QI** Koma: jo** um: rsrs pr0n** FelipeAugusto: esp** GustavoPupo: pinto tr etc** GP: lit gtk** Alan: jo mil pc** Jost: b hq jo 1997** Herbert: b rsrs pr0n** Andre: maia mil pseudo** Rodrigo: c** caue: b rsrs 7arte pseudo** kenny: cri gif** daniel: gtk mu pr0n rsrs b** tony: an 1997 esp** Vitor: b jo mimimi** raphael: b rpg 7arte** Luca: b lit gnu pc prog mmu 7arte 1997** LZZ: an qt** William: b an jo pc 1997** Epic: gtk** Aldo: b pseudo pol mil fur** GustavoKyon: an gtk** CarlosIsaksen : an hq jo 7arte gtk 1997** Peter: pseudo pol mil est 1997 gtk lit lang** leandro: b jo cb** frederico: 7arte lit gtk** rol: b an pseudo mimimi 7arte** mathias: jo lit** henrique: 1997 h gtk qt** eumané: an qt** walrus: cri de** FilipePinheiro: lit pseudo** Igor: pseudo b** Erick: b jo rpg q 1997 gtk** Gabriel: pr0n rsrs qt** george: clo mimimi** anão: hq jo 1997 rsrs clô b** jeff: 7arte gtk** davidatenas:  an 7arte 1997 esp qt** HHahaah: b ** Eduardo: b

是与标签关联的名称列表,我想获取与名称关联的标签列表。

在 bash 中,我会首先用单引号回显粘贴的整个内容,然后将其通过管道传输到 awk,遍历每一行并将它的每一部分添加到正确的临时变量中,然后弄乱它直到它像我想要的那样。

echo '** Diego: b QI** bruno-gil: b QI** Koma: jo** um: rsrs pr0n** FelipeAugusto: esp** GustavoPupo: pinto, tr etc** GP: lit gtk** Alan: jo mil pc** Jost: b hq jo 1997** Herbert: b rsrs pr0n** Andre: maia mil pseudo** Rodrigo: c** caue: b rsrs 7arte pseudo** kenny: cri gif** daniel: gtk mu pr0n rsrs b** tony: an 1997 esp** Vitor: b jo mimimi** raphael: b rpg 7arte** Luca: b lit gnu pc prog mmu 7arte 1997** LZZ: an qt** William: b an jo pc 1997** Epic: gtk** Aldo: b pseudo pol mil fur** GustavoKyon: an gtk** CarlosIsaksen : an hq jo 7arte gtk 1997** Peter: pseudo pol mil est 1997 gtk lit lang** leandro: b jo cb** frederico: 7arte lit gtk** rol: b an pseudo mimimi 7arte** mathias: jo lit** henrique: 1997 h gtk qt** eumané: an qt** walrus: cri de** FilipePinheiro: lit pseudo** Igor: pseudo b** Erick: b jo rpg q 1997 gtk** Gabriel: pr0n rsrs qt** george: clo mimimi** anão: hq jo 1997 rsrs clô b** jeff: 7arte gtk** davidatenas:  an 7arte 1997 esp qt** HHahaah: b** Eduardo: b' | awk '{sub(":","");for (i=3;i<=NF;i++) members[$i] = members[$i] " " $2}; END{for (j in members) print j ": " members[j]}' | sort

...还有TA-DA!不到 2 分钟的预期输出,以直观和渐进的方式完成。你能告诉我如何在 elisp 中,最好是在 emacs 缓冲区中,优雅而简单地做这样的事情吗?

谢谢!

最佳答案

我要做的第一件事是利用 org-mode 的标签支持。而不是

** Diego: b QI

你会

** Diego                          :b:QI:

org-mode 识别标签“b”和“QI”。

要将当前格式转换为标准 org-mode 格式,您可以使用以下(假设您的源缓冲区称为“asdf”)

(with-current-buffer "asdf"
(beginning-of-buffer)
(replace-string " " ":")
(beginning-of-buffer)
(replace-string "**:" "** ")
(beginning-of-buffer)
(replace-string "::" " :")
(beginning-of-buffer)
(replace-string "\n" ":\n")
(org-set-tags-command t t))

它不是很漂亮或效率不高,但它可以完成工作。

之后,您可以使用以下命令生成具有以下格式的缓冲区你想从 shell 脚本中得到:

(let ((results (get-buffer-create "results"))
tags)
(with-current-buffer "asdf"
(beginning-of-buffer)
(while (org-on-heading-p)
(mapc '(lambda (item) (when item (add-to-list 'tags item))) (org-get-local-tags))
(outline-next-visible-heading 1)))
(setq tags (sort tags 'string<))
(with-current-buffer results
(erase-buffer)
(mapc '(lambda (item)
(insert (format "%s: %s\n"
item
(with-current-buffer "asdf"
(org-map-entries '(substring-no-properties (org-get-heading t)) item)))))
tags)
(beginning-of-buffer)
(replace-regexp "[()]" "")))

这会将结果放在一个名为“results”的缓冲区中,如果没有则创建它已经存在。基本上,它收集缓冲区“asdf”中的所有标签,对它们进行排序,然后遍历每个标签并搜索每个标题该标签在“asdf”中并将其插入到“结果”中。

经过一些清理,这可以变成一个函数;基本上只是用参数替换“asdf”和“results”。如果你需要那样做,我可以做那个。

关于emacs - 使用 elisp 处理文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1994075/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com