[英]replace string after pattern with filename
我有多個 .gbf 文件,我需要將單詞 DEFINITION 的每個實例之后的所有內容替換到行尾,並使用其各自的文件名(考慮中間的兩個空格)。
文件名示例:GCF_000219725.1_ASM882v1___Lalala_holae_9a5c.gbf
文件中感興趣的部分:
DEFINITION random_chacacters_including_spaces
想要的輸出:
DEFINITION GCF_000219725.1_ASM882v1___Lalala_holae_9a5c.gbf
想的是這樣的:
for f in *.gbf; do sed 's/DEFINITION .*$/DEFINITION "$f"/g'; done
這不起作用
謝謝
您的嘗試包含兩個錯誤:
$f
(是的,這兩個"
也是單引號表達式的一部分);sed
命令沒有提供文件名,它是$f
作為參數;s
命令中不需要g
標志。所以你想要做的實際上是以下內容:
for f in *.gbf
do
sed 's/DEFINITION .*$/DEFINITION '"$f"'/' "$f" > "$f.new"
done
其中sed
腳本是三個字符串的串聯,它們依次是單引號、雙引號、單引號。 這種方法不斷防止在單引號部分進行擴展,同時允許在雙引號部分進行擴展。 在您提供的具體示例中,沒有區別,但通常建議使用單引號字符串(並且sed
命令是字符串),除非您需要將它們雙引號(參見學習 bash Shell,第 3 版,頁面頂部) 147 )。 在后一種情況下, sed
命令將是:
sed "s/DEFINITION .*$/DEFINITION $f/" "$f" > "$f.new"
此外,您需要將輸出放在某處,例如在名為$f.new
的新文件中(或者您可以使用sed
的-i
選項,如果我沒記錯的話,它不是 POSIX)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.