簡體   English   中英

用文件名替換模式后的字符串

[英]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.

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