簡體   English   中英

獲取bash中某些字符串之間的字符串列表

[英]Get list of strings between certain strings in bash

給定一個文本文件 (.tex),其中可能包含“\\cite{alice}”、“\\cite{bob}”等形式的字符串,我想編寫一個 bash 腳本,將內容存儲在每個這樣的字符串(“alice”和“bob”)在一個新的文本文件(比如,.txt)中。 在輸出文件中,我希望每個這樣的內容都有一行,並且我也希望避免重復。

嘗試:

  • 我想過將 grep 和 cut 結合起來。 從我在 Stack Exchange 上看到的其他問題和答案中,我認為(模數閱讀更多)我可以設法每行至少獲得一個這樣的內容,但我不知道如何獲得所有出現的單行,如果其中有幾個這樣的字符串,並且我沒有看到任何問題或答案在這個方向上給出提示。
  • 我也嘗試過使用 sed。 昨天我讀了這個指南,看看我是否遺漏了一些基本的 sed 命令,但我沒有看到任何簡單的方法來做我想做的事情(指南確實提到 sed 是圖靈完備的,所以我相信有辦法做到這僅適用於 sed,但我不知道如何)。

關於什么:

grep -oP '(?<=\\cite{)[^}]+(?=})' sample.tex | sort -u > cites.txt
  • -PGNU grep將正則表達式解釋為 Perl 兼容的(對於后視前瞻組)
  • -o 打印匹配行的匹配(非空)部分,每個這樣的部分在單獨的輸出行上 (參見手冊
  • 正則表達式匹配前面是\\cite{正后視(?<=\\\\cite{) )和右花括號(正后視(?=}) )的無花括號文本
  • sort -u排序並刪除重復項

有關前向和后向組的更多詳細信息,請參閱Regular-Expressions.info 專用頁面

您可以使用grep -o並對其輸出進行后處理:

grep -o '\\cite{[^{}]*}' file.tex |
sed 's/\\cite{\([^{}]*\)}/\1/'

如果輸入行上只能有一個\\cite ,那么只需要一個sed腳本就足夠了。

sed -n 's/.*\\cite{\([^{}]*\)}.*/\1/p' file.tex

(將其重構為每行提取多次出現的腳本絕不是不可能的;但祝您在六周后能理解您的代碼。)

像往常一樣,添加sort -u以刪除任何重復。

這是一個簡短的 awk 嘗試:

awk -v RS='\' '/^cite\{/ {
    split($0, g, /[{}]/)
    cite[g[2]]++ }
  END { for (cit in cite) print cit }' file.tex

這方便地不會打印任何重復項,並且可以輕松地處理每行的多個引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM