[英]Get list of strings between certain strings in bash
給定一個文本文件 (.tex),其中可能包含“\\cite{alice}”、“\\cite{bob}”等形式的字符串,我想編寫一個 bash 腳本,將內容存儲在每個這樣的字符串(“alice”和“bob”)在一個新的文本文件(比如,.txt)中。 在輸出文件中,我希望每個這樣的內容都有一行,並且我也希望避免重復。
嘗試:
關於什么:
grep -oP '(?<=\\cite{)[^}]+(?=})' sample.tex | sort -u > cites.txt
-P
與GNU 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.